transactionscope mysql_TransactionScope 的基本原理简介

transactionscope mysql_TransactionScope 的基本原理简介C#的事务编程1Db事务DbConnection中创建基于当前连接的DbTransaction2使用TransactionScope,创建环境事务一旦创建,在这个环境包含的DbConnection实例都会根据连接字符串中的Sqlserver连接字符串支持,是否自动附加当前环境事务.连接字符串关键字(Enlist)SqlConnection.ConnectionString属性…

大家好,又见面了,我是你们的朋友全栈君。

C# 的事务编程

1 Db事务

DbConnection 中创建基于当前连接的 DbTransaction

2  使用TransactionScope ,创建环境事务

一旦创建,在这个环境包含的DbConnection 实例 都会根据连接字符串中的

Sqlserver 连接字符串支持,是否自动附加当前环境事务.

连接字符串关键字(Enlist)

SqlConnection.ConnectionString 属性支持关键字 Enlist,该关键字指示 System.Data.SqlClient 是否将检测事务上下文并自动在分布式事务中登记连接。 如果 Enlist=true,连接将自动在打开的线程的当前事务上下文中登记。 如果 Enlist=false,SqlClient 连接不会与分布式事务进行交互。 Enlist 的默认值为 true。 如果连接字符串中未指定 Enlist,若在连接打开时检测到一个,连接将自动在分布式事务中登记。

Server=(local)SQL2005;Database=Northwind;Integrated Security=SSPI;auto-enlist=false

Mysql 等其他 OLDP数据库 需要驱动支持。

f42d7d1e7fa0736e0b93329fb9b349be.png

32fa6895f5fdab123a3026663f5e20ab.png

974c79340fbeee35baee9a0d346073c4.png

d848b16cb52292b753476fd916636ac9.png

以下来自MSDN:

System.Transactions 基础结构提供了这两个的显式编程模型基于 Transaction 类,以及隐式编程模型使用 TransactionScope 类,在其中事务自动管理基础结构。

IC160177.jpeg重要事项

建议您创建使用隐式事务 TransactionScope 类,以便为您自动管理环境事务上下文。您还应该使用 TransactionScope 和 DependentTransaction 跨多个函数调用或多个线程调用需要使用相同的事务的应用程序的类。此模型的详细信息,请参阅 Implementing An Implicit Transaction Using Transaction Scope 主题。编写事务应用程序的详细信息,请参阅 Writing A Transactional Application。

在实例化 TransactionScope 通过 new 语句中,事务管理器确定哪些事务参与进来。一旦确定,该范围将始终参与该事务。此决策基于两个因素:是否存在环境事务以及构造函数中 TransactionScopeOption 参数的值。环境事务是在代码中执行的事务。可通过调用 Current 类的静态 Transaction 属性,获取对环境事务的引用。有关如何使用此参数的详细信息,请参阅的”事务流的管理”部分 Implementing An Implicit Transaction Using Transaction Scope 主题。

如果在事务范围内未不发生任何异常 (即之间的初始化 TransactionScope 对象并调用其 Dispose 方法),则范围所参与的事务可以继续。如果在事务范围内发生异常,参与到其中的事务将回滚。

当您的应用程序完成所有工作时它想要在事务中执行,应调用 Complete 方法一次,以通知该事务管理器是可接受,即可提交事务。未能调用此方法中止事务。

调用 Dispose 方法将标记事务范围的末尾。在调用此方法之后所发生的异常不会影响事务。

如果您修改的值 Current 内某个范围内,将引发异常时 Dispose 调用。但是,在作用域结束时,以前的值被还原。此外,如果您调用 Dispose 上 Current 在事务范围创建事务,事务将中止范围的末尾。

//This function takes arguments for 2 connection strings and commands to create a transaction//involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the//transaction is rolled back. To test this code, you can connect to two different databases//on the same server by altering the connection string, or to another 3rd party RDBMS by//altering the code in the connection2 code block.

static public intCreateTransactionScope(string connectString1, stringconnectString2,string commandText1, stringcommandText2)

{//Initialize the return value to zero and create a StringWriter to display results.

int returnValue = 0;

System.IO.StringWriter writer= newSystem.IO.StringWriter();try{//Create the TransactionScope to execute the commands, guaranteeing//that both commands can commit or roll back as a single unit of work.

using (TransactionScope scope = newTransactionScope())

{using (SqlConnection connection1 = newSqlConnection(connectString1))

{//Opening the connection automatically enlists it in the//TransactionScope as a lightweight transaction.

connection1.Open();//Create the SqlCommand object and execute the first command.

SqlCommand command1 = newSqlCommand(commandText1, connection1);

returnValue=command1.ExecuteNonQuery();

writer.WriteLine(“Rows to be affected by command1: {0}”, returnValue);//If you get here, this means that command1 succeeded. By nesting//the using block for connection2 inside that of connection1, you//conserve server and network resources as connection2 is opened//only when there is a chance that the transaction can commit.

using (SqlConnection connection2 = newSqlConnection(connectString2))

{//The transaction is escalated to a full distributed//transaction when connection2 is opened.

connection2.Open();//Execute the second command in the second database.

returnValue = 0;

SqlCommand command2= newSqlCommand(commandText2, connection2);

returnValue=command2.ExecuteNonQuery();

writer.WriteLine(“Rows to be affected by command2: {0}”, returnValue);

}

}//The Complete method commits the transaction. If an exception has been thrown,//Complete is not called and the transaction is rolled back.

scope.Complete();

}

}catch(TransactionAbortedException ex)

{

writer.WriteLine(“TransactionAbortedException Message: {0}”, ex.Message);

}catch(ApplicationException ex)

{

writer.WriteLine(“ApplicationException Message: {0}”, ex.Message);

}//Display messages.

Console.WriteLine(writer.ToString());returnreturnValue;

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161935.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • docker -t_docker -f

    docker -t_docker -f在面试中关于多线程同步,你必须要思考的问题一文中,我们知道glibc的pthread_cond_timedwait底层是用linuxfutex机制实现的。理想的同步机制应该是没有锁冲突时在用户态利用原子指令就解决问题,而需要挂起等待时再使用内核提供的系统调用进行睡眠与唤醒。换句话说,在用户态的自旋失败时,能不能让进程挂起,由持有锁的线程释放锁时将其唤醒?如果你没有较深入地考虑过这个问题,很可能…

    2022年9月15日
    2
  • python中dtype的使用规范_Python numpy.dtype() 使用实例

    python中dtype的使用规范_Python numpy.dtype() 使用实例Thefollowingarecodeexamplesforshowinghowtouse.TheyareextractedfromopensourcePythonprojects.Youcanvoteuptheexamplesyoulikeorvotedowntheexmaplesyoudon’tlike.Youcanal…

    2022年6月6日
    80
  • 【STM32】HAL库 STM32CubeMX教程十三—RTC时钟

    【STM32】HAL库 STM32CubeMX教程十三—RTC时钟前言:本系列教程将对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用所用工具:1、芯片:STM32F407ZET6/STM32F103ZET62、STM32CubeMx软件3、IDE:MDK-Keil软件4、STM32F1xx/STM32F4xxHAL库知识概括:通过本篇博客您将学到:RTC时钟原理STM32CubeMX创建…

    2022年6月2日
    236
  • php redis缓存雪崩,redis雪崩是什么「建议收藏」

    php redis缓存雪崩,redis雪崩是什么「建议收藏」什么是redis的雪崩?下面本篇文章就来给大家简单介绍一下,希望对你们有所帮助。什么是雪崩?因为缓存层承载了大量的请求,有效的保护了存储层,但是如果缓存由于某些原因,整体不能够提供服务,于是所有的请求,就会到达存储层,存储层的调用量就会暴增,造成存储层也会挂掉的情况。缓存雪崩的英文解释是奔逃的野牛,指的是缓存层当掉之后,并发流量会像奔腾的野牛一样,大量访问后端存储。缓存雪崩通俗简单的理解就是:由于…

    2022年9月14日
    4
  • C#网络编程(Socket编程)「建议收藏」

    C#网络编程(Socket编程)「建议收藏」一、Socket网络编程1.Socket是什么?在计算机通信领域,Socket被译为“套接字”。它是计算机之间进行通信的一种约定或一种方式。通过Socket这种约定可以接收到其他计算机的数据,也可以向其他计算机发送数据。2.本质是编程接口(API),对于TCP/IP的封装,TCP/IP也提供了可供程序员做网络开发所用的接口3.作用Socket的英文原意是“插座”,的意思,通常在计算机编…

    2022年7月13日
    14
  • 关于异步FIFO设计,这7点你必须要搞清楚「建议收藏」

    关于异步FIFO设计,这7点你必须要搞清楚「建议收藏」这篇文章可能帮助您:了解异步FIFO设计中的7个要点。

    2022年8月13日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号