1 int flag = 0; 2 using (SqlConnection conn = SqlHelper.GetConn()) 3 { 4 using (SqlTransaction tran = conn.BeginTransaction()) 5 { 6 try 7 { 8 //做了几次数据库操作 9 10 11 if (0 < flag) { tran.Commit(); } 12 else { tran.Rollback(); } 13 } 14 catch 15 { 16 tran.Rollback(); 17 throw; 18 } 19 } 20 }
针对以上代码,我有个疑问?
通过using tran会自动调用Dispose(),那么 tran.Rollback()是否有必要?是否可以舍弃try...catch 和 tran.Rollback(),反正都会释放。
显示调用 回滚和不调用回滚,直接Dispose(),有什么影响?
参考:
https://referencesource.microsoft.com/#System.Data/fx/src/data/System/Data/SqlClient/SqlTransaction.cs,2020d30f68510cce,references
MS SqlServer库
想明确:
1、try...catch{ tran.Rollbakc() }是否可以忽略不写?(已明确可以不写,会直接销毁;想问下,直接销毁了,销毁前没有回滚,对程序有什么影响?)
2、try...catch{ tran.Rollbakc() }忽略与不忽略,具体有什么区别?究竟是加上好?还是不加好?
因为对程序方法背后的具体了解的不够清楚,所以产生这些问题。
这个要从数据库的角度看 我猜测没有tran.Rollback() 执行到一半的命令无法回滚了 这个可以实际在数据库执行看一下 Dispose()这个是用来释放事务占用的资源的 每次都要释放的 跟回滚是没有关系的
回滚无关,那我是否可以只如此:
int flag = 0; using (SqlConnection conn = SqlHelper.GetConn()) { using (SqlTransaction tran = conn.BeginTransaction()) { //做了几次数据库操作 if (0 < flag) { tran.Commit(); } } }
不用再加try...catch也不用 tran.Rollback(); 只需要成功时提交即可?
@淋风淼淼: 嗯 可以这样的 如果异常了会在释放连接时自动回滚
sqlserver层面,如果未完整全部sql成功,有一个异常这个事务的sql会rollback掉的。可以试下。
你的意思是,如果发生异常,事务会自动回滚,不需要我主动使用try...catch 和 tran.Rollback();吗?
@淋风淼淼: 对的。不回滚就是提交,或数据异常。这个DB会考虑的。
rollback 好像与using没有关系?