entityframework-分布式事务TransactionScope

本文介绍了两种事务管理方式:TransactionScope和SqlConnection.Transaction。TransactionScope支持跨多个相同连接字符串的数据库操作,适用于分布式事务;SqlConnection.Transaction则更适合单一连接内的事务处理,提供更高效的数据层操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何适用

开启一个事务

//----------------------------------------------TransactionScope -------------------------------------------------------------------

using(TransactionScope scope =

 new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead }))

{

//todo something

//todo something

//todo something

提交事务scope .Complete();

}

该事务无rollback,如果在事务内异常后会自动回滚,前提是必须用Using语句引用该事务


TransactionScopeOption.Required 事务类型,如果当前环境存在事务,则自动附加到当前事务中,并成为该事务的子事务

具体如下:

Required

如果已经存在一个事务,那么这个事务范围将加入已有的事务。否则,它将创建自己的事务。

RequiresNew

这个事务范围将创建自己的事务。

Suppress

如果处于当前活动事务范围内,那么这个事务范围既不会加入氛围事务 (ambient transaction),也不会创建自己的事务。当部分代码需要留在事务外部时,可以使用该选项。



注意事项:

一个scope内不能开启多个不同连接字符串的连接,否则会异常,解决方案:如果要开启新的连接字符串连接,可以将子连接置于一个嵌套的scope内,如下:

using(TransactionScope fatherScope = 

new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead }))

{

using(TransactionScope chidlScope= 

new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead }))

{

//这里添加新的字符串连接,再进行跨库操作

chidlScope.Complete();

}


fatherScope .Complete();

}


//----------------------------------------------sqltransaction-------------------------------------------------------------------

using (SqlConnection conn = new SqlConnection("conn"))
            {
                conn.Open();
 
                using (var tran = conn.BeginTransaction())
                {
                    //to do something
 
                    tran.Commit();
                }
 
                conn.Close();
            }


与 sqlconnection.transaction 相比

1.scope 没有显示开启事务,所以只能使用一次

2.当scope事务达到一定级别后,事务会上升到分布式级别

3.sqltransaction在数据层效率明显会高出很多,而且可以很方便在需要查询的时候可以显示开启和关闭事务,提升整体性能

4.sqltransaction事务只能在一个连接内完成,scope 可以跨多个数据库连接(必须是相同连接字符串)


总体来说

根据业务需要来定适用何种事务来保证数据完整性


拙笔,往大神指点


参考:http://www.cnblogs.com/blsong/archive/2010/08/13/1798987.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码者人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值