首页 新闻 会员 周边 捐助

事物执行多个sql的时候,事物提交前有select操作,这select 有没有必要放到事物中?

0
悬赏园豆:10 [待解决问题]

using (IDbConnection con = dal.CreateDBConnection())
{
con.Open();
try
{
using (IDbTransaction tran = con.BeginTransaction())

 1.插入一个表操作+带事物

 2.查询某个表 获取值(这个地方查询是带事物好还是不带?)

3.根据2查询的值 插入另一个表+事物

}

if (isSuccess)
tran.Commit();
else
tran.Rollback();
}
}
finally
{
con.Close();
}

}

IDOER的主页 IDOER | 初学一级 | 园豆:19
提问于:2016-11-18 12:02
< >
分享
所有回答(6)
0

强迫症,事务

~扎克伯格 | 园豆:1923 (小虾三级) | 2016-11-18 12:53
0

 事务通过锁来实现原子特性,如果隔离级别不是可重复读以上,select持有的共享锁会在查询结束后释放,因此,是否放在事务中,跟你的隔离级别和业务逻辑有关系,单纯从代码上看,放在一起,是最简单无脑的

悦光阴 | 园豆:2251 (老鸟四级) | 2016-11-18 12:58

如果单纯一个方法,方法里就这些操作,可以把查询的操作 放到事物的前面,但是如果再循环里用事物,而且当中要查询表 然后进行事物插入操作,那这个查询是带事物还是不带事物的好??

支持(0) 反对(0) IDOER | 园豆:19 (初学一级) | 2016-11-18 13:01

错了 应该是事物中有循环插入,并且里面带select

支持(0) 反对(0) IDOER | 园豆:19 (初学一级) | 2016-11-18 13:03

@efreer: 在循环中使用事务吧,,如果事务中应用循环,可能会导致表长时间锁定,影响并发性

支持(0) 反对(0) 悦光阴 | 园豆:2251 (老鸟四级) | 2016-11-18 13:04

@悦光阴:我想问的是 事物中的select 是应该带上事物,还是不带好,但是我看到有个文章中说 事物代码中的任何sql 必须全部用事物,否则会产生锁的问题。

支持(0) 反对(0) IDOER | 园豆:19 (初学一级) | 2016-11-18 13:07
0

带不带你自己看自己的逻辑啊,如果两次修改需要一致性那就带上咯,反之就不用了。

 

Daniel Cai | 园豆:10424 (专家六级) | 2016-11-18 13:19

是我看到有个文章中说 事物代码中的任何sql 必须全部用事物,否则会产生锁的问题。

支持(0) 反对(0) IDOER | 园豆:19 (初学一级) | 2016-11-18 13:20

@efreer: 事务和锁没任何关系,事务只考虑隔离级别。语句才产生锁。

是否会死锁取决于你的事务中的语句的加锁顺序是否一致,如果有地方不一致就可能会导致死锁。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-11-18 13:25
0

 可以是可以 
不过你也可以在事务之前就查出来啊。

完全没必要放在事务中查

如果你想搞事务进行中的数据  你这个select  也没用

逆天蓝 | 园豆:147 (初学一级) | 2016-11-18 17:12

因为有时候必须在事物里查,比如 很多复杂的计算,一个插入操作会单独写在另一个方法里,这个方法里有select,插入在这个方法里 带事物的

支持(0) 反对(0) IDOER | 园豆:19 (初学一级) | 2016-11-18 17:56
0

存不存在你操作过程中,第二步的查询数据被修改的可能性?!考虑到整体操作块的读写一致性,不太了解你的实际场景,不过,看你的代码段,放事务中可能会好一些。

林小白_ | 园豆:197 (初学一级) | 2016-11-23 18:03
0

你的写法,已经是1,2,3都包含在事物中了。如果你的1和3是要保证原子性的,那么就像你现在这样就可以了。

一剑侵心 | 园豆:281 (菜鸟二级) | 2016-12-19 10:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册