如何适用
开启一个事务
//----------------------------------------------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