首页 新闻 会员 周边 捐助

C# 在using(){} 中使用SqlTransaction是否有必要显式调用Rollback()?

0
悬赏园豆:30 [已解决问题] 解决于 2024-12-03 14:19
 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() }忽略与不忽略,具体有什么区别?究竟是加上好?还是不加好?

因为对程序方法背后的具体了解的不够清楚,所以产生这些问题。

 
淋风淼淼的主页 淋风淼淼 | 初学一级 | 园豆:125
提问于:2022-03-04 16:45
< >
分享
最佳答案
1

这个要从数据库的角度看 我猜测没有tran.Rollback() 执行到一半的命令无法回滚了 这个可以实际在数据库执行看一下 Dispose()这个是用来释放事务占用的资源的 每次都要释放的 跟回滚是没有关系的

收获园豆:25
异构元素 | 小虾三级 |园豆:544 | 2022-03-07 17:05

回滚无关,那我是否可以只如此:

int flag = 0;
            using (SqlConnection conn = SqlHelper.GetConn())
            {
                using (SqlTransaction tran = conn.BeginTransaction())
                {
                     //做了几次数据库操作
                     if (0 < flag) { tran.Commit(); }
                }
            }

不用再加try...catch也不用 tran.Rollback(); 只需要成功时提交即可?

淋风淼淼 | 园豆:125 (初学一级) | 2022-03-11 11:09

@淋风淼淼: 嗯 可以这样的 如果异常了会在释放连接时自动回滚

异构元素 | 园豆:544 (小虾三级) | 2024-11-26 12:28
其他回答(2)
1

sqlserver层面,如果未完整全部sql成功,有一个异常这个事务的sql会rollback掉的。可以试下。

收获园豆:5
chzjxgd | 园豆:207 (菜鸟二级) | 2022-03-09 15:04

你的意思是,如果发生异常,事务会自动回滚,不需要我主动使用try...catch 和 tran.Rollback();吗?

支持(0) 反对(0) 淋风淼淼 | 园豆:125 (初学一级) | 2022-03-11 11:11

@淋风淼淼: 对的。不回滚就是提交,或数据异常。这个DB会考虑的。

支持(0) 反对(0) chzjxgd | 园豆:207 (菜鸟二级) | 2022-07-19 11:31
0

rollback 好像与using没有关系?

gw2010 | 园豆:1487 (小虾三级) | 2022-03-11 15:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册