看到一处代码
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语句操控数据库,就没必要开启事务了吧?
这是我第一次在博客园提问,求各位帮忙解答下%>_<%
上面二位 估计平时一般是不写代码,只是在旁边瞎指挥一下,因为你们不知道现在好多公司的代码都是这样子写的。你们认为它这样子写是狗屁设计,但是它确实有存在的道理,但为什么要这样子写呢?
其实 “只有一次操作的话,一般不用开启事务”,这个确实是对的。
但是 实际中的时候,这个方法 一般传递的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;“参数)
所以它这个 底层才这样子编写的。
嗯,理解了.谢谢~
@萌群主:
1、尽可能避免如此写多行SQL语句。
2、95%以上的场景是不需要这样写SQL语句的。
3、就算是需要这样写多行SQL 语句,也不一定需要事务,整天写代码的码农不动脑筋才这样写的。
4、首先你得知道啥叫事务,否则你不要写事务,而这个普通人的水平,五年内你可以不用管事务,
如果你懂得啥是事务,并且知道会产生什么问题,以及如何处理,你就算是一个合格的程序员了。
@爱编程的大叔: 请问大叔:3、就算是需要这样写多行SQL 语句,也不一定需要事务,整天写代码的码农不动脑筋才这样写的。”
我想问一下,这样子写多行SQL语句,难道 不用事务???我很是怀疑你的真实水平……
@田麦成: 我水平很烂的,几乎不写事务的。你懂得啥是事务那就很好,不要教坏了小孩子就行。
我这些话只是说给编程不到五年,或者编程编了十年水平还是和一年水平差不多的人的。
@爱编程的大叔: 我理解肤浅,大概明白事务可以达到类似数据库回滚的效果.要么全部正确通过,要么全部回滚到原点%>_<%
Commit表示提交本次事务的修改到数据库,不是释放资源。
事务是为了保证数据一致性,如果只有一次操作的话,一般不用开启事务。
谢谢~
写书的人哪里知道读书人的水平啊,只能按照最最安全的方法写。
你没明白啥是事务前根本不需要使用事务,80%的程序员错误使用事务。
系统做得又慢又难用,就是这帮人做出来的。
谢谢~