首页 新闻 会员 周边

关于using包裹的事务的疑问

0
悬赏园豆:10 [已解决问题] 解决于 2015-08-14 23:48

看到一处代码

 1 /// <summary>  
 2         /// 对SQLite数据库执行增删改操作,返回受影响的行数。  
 3         /// </summary>  
 4         /// <param name="sql">要执行的增删改的SQL语句</param>  
 5         /// <param name="parameters">执行增删改语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param>  
 6         /// <returns></returns>  
 7         public int ExecuteNonQuery(string sql, SQLiteParameter[] parameters)  
 8         {  
 9             int affectedRows = 0;  
10             using (SQLiteConnection connection = new SQLiteConnection(connectionString))  
11             {  
12                 connection.Open();  
13                 using (DbTransaction transaction = connection.BeginTransaction())  
14                 {  
15                     using (SQLiteCommand command = new SQLiteCommand(connection))  
16                     {  
17                         command.CommandText = sql;  
18                         if (parameters != null)  
19                         {  
20                             command.Parameters.AddRange(parameters);  
21                         }  
22                         affectedRows = command.ExecuteNonQuery();  
23                     }  
24                     transaction.Commit();  
25                 }  
26             }  
27             return affectedRows;  
28         }  

这里看到事务commit了,而且是用using()包裹的,using结束后不是会自动释放资源么,会不会自动结束事务?

如果会自动结束事务,那么只有一句sql语句操控数据库,就没必要开启事务了吧?

这是我第一次在博客园提问,求各位帮忙解答下%>_<%

萌群主的主页 萌群主 | 初学一级 | 园豆:165
提问于:2015-08-09 00:39
< >
分享
最佳答案
0

上面二位 估计平时一般是不写代码,只是在旁边瞎指挥一下,因为你们不知道现在好多公司的代码都是这样子写的。你们认为它这样子写是狗屁设计,但是它确实有存在的道理,但为什么要这样子写呢?

其实 “只有一次操作的话,一般不用开启事务”,这个确实是对的。

但是 实际中的时候,这个方法 一般传递的SQL语句 可不止一条。它往往是这样子调用的。

ExecuteNonQuery("

insert into A(XXX,XXX) values(XXX,XXX);

insert intoB(XXX,XXX) values(XXX,XXX)";

insert intoB(XXX,XXX) values(XXX,XXX)";

delete from C where XXXXX

update from AAA set FFFF='XXXX;“参数)

 

所以它这个 底层才这样子编写的。

需要格局 | 老鸟四级 |园豆:2145 | 2015-08-10 10:20

嗯,理解了.谢谢~

萌群主 | 园豆:165 (初学一级) | 2015-08-10 10:38

@萌群主:

1、尽可能避免如此写多行SQL语句。

2、95%以上的场景是不需要这样写SQL语句的。

3、就算是需要这样写多行SQL 语句,也不一定需要事务,整天写代码的码农不动脑筋才这样写的。

4、首先你得知道啥叫事务,否则你不要写事务,而这个普通人的水平,五年内你可以不用管事务,

如果你懂得啥是事务,并且知道会产生什么问题,以及如何处理,你就算是一个合格的程序员了。

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-08-10 10:49

@爱编程的大叔: 请问大叔:3、就算是需要这样写多行SQL 语句,也不一定需要事务,整天写代码的码农不动脑筋才这样写的。”

我想问一下,这样子写多行SQL语句,难道 不用事务???我很是怀疑你的真实水平……

需要格局 | 园豆:2145 (老鸟四级) | 2015-08-10 14:11

@田麦成:   我水平很烂的,几乎不写事务的。你懂得啥是事务那就很好,不要教坏了小孩子就行。

我这些话只是说给编程不到五年,或者编程编了十年水平还是和一年水平差不多的人的。

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-08-10 14:14

@爱编程的大叔: 我理解肤浅,大概明白事务可以达到类似数据库回滚的效果.要么全部正确通过,要么全部回滚到原点%>_<%

萌群主 | 园豆:165 (初学一级) | 2015-08-11 01:16
其他回答(2)
0

Commit表示提交本次事务的修改到数据库,不是释放资源。

事务是为了保证数据一致性,如果只有一次操作的话,一般不用开启事务。

I,Robot | 园豆:9783 (大侠五级) | 2015-08-09 07:55

谢谢~

支持(0) 反对(0) 萌群主 | 园豆:165 (初学一级) | 2015-08-10 10:38
0

写书的人哪里知道读书人的水平啊,只能按照最最安全的方法写。

你没明白啥是事务前根本不需要使用事务,80%的程序员错误使用事务。

系统做得又慢又难用,就是这帮人做出来的。

收获园豆:10
爱编程的大叔 | 园豆:30839 (高人七级) | 2015-08-09 09:40

谢谢~

支持(0) 反对(0) 萌群主 | 园豆:165 (初学一级) | 2015-08-10 10:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册