TransactionOptions transactionOption = new TransactionOptions(); //设置事务隔离级别 transactionOption.IsolationLevel = System.Transactions.IsolationLevel.Serializable; // 设置事务超时时间为60秒 transactionOption.Timeout = new TimeSpan(0, 0, 30); using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption)) { //处理业务逻辑 scope.Complete(); }
一、TransactionScope的优点
1、使用起来比较方便.TransactionScope可以实现隐式的事务,使你可以在写数据访问层代码的时候不用考虑到事务,而在业务层的控制事务.
2、可以实现分布式事务,比如跨库或MSMQ.
二、TransactionScope缺点
1、性价比不高.比如,你只是在"Scope"里控制一个库的事务.用"TransactionScope"就有点浪费了.
2、一般情况下只要你使用"TransactionScope",都要配置MSDTC,要配防火墙,要开139端口.这个端口不可以更改
三、TransactionScope事务级别
在TransactionScope中默认的事务级别是Serializable,即在事务过程中,完全性锁表。别的进程不能查询,修改,新增,删除。这样会导致效率大大降低,虽然数据完整性很高。通常我们不需要那么高的数据完整性。所以需要修改默认的事务级别。
四、在C#中使用TransactionScope类(分布式事务),则须注意如下事项
1、在项目中引用using System.Transactions命名空间(先要在添加net组件的引用);
2、对MSDTC组件设置:
在控制面板--->管理工具--->服务 中,开启Distributed Transaction Coordinator 服务。
a、控制面板->管理工具->组件服务->计算机->我的电脑->右键->属性
b、选择MSDTC页, 确认"使用本地协调器"
c、点击下方"安全配置"按钮
d、勾选: "允许网络DTC访问","允许远程客户端","允许入站","允许出站","不要求进行身份验证".
e、对于数据库服务器端, 可选择"要求对呼叫方验证"
f、勾选:"启用事务Internet协议(TIP)事务"。
g、在双方防火墙中增加MSDTC.exe例外
可用命令行: netsh firewall set allowedprogram %windir%/system32/msdtc.exe MSDTC enable
3、重启IIS服务器。
注意:
我们只要确保数据库的打开操作是在事务范围内打开就行了。这样就可以做到事务的正确操作。
如果WEB服务器和数据库是在同一台服务器上,TransactionScope使用的是本地事务,这时不需要配置MSDTC。
如果WEB服务器和数据库不在同一台服务器上,TransactionScope会自动提升事务级别为分布式事务,这时就需要配置MSDTC。