浏览 2806 次
锁定老帖子 主题:db2v8 update嵌套子查询的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-07-14
数据库db2v8,隔离级别cs 在测试update语句的时候发现: update A set a=1 where a=2; update A set a=1 where a in(select a from A where a=2); 单个session执行,两者的结果是一样的。 在并发情况下发现一些不同: 多做点数据保证真正并发,比如50w,无索引更新100条。 第一种情况: 1:update A set a=1 where a=2; 2:update A set a=3 where a=2; 先后以1,2的顺序并发执行。 结果是1执行的结果,而后执行的因为先前已经修改了a 所以执行后更新的行为0; 第二种情况 3:update A set a=1 where a in(select a from A where a=2); 4:update A set a=3 where a in(select a from A where a=2); 先后以3,4的顺序并发执行。 结果是4执行的结果。原因是3执行后结果被4自行后结果覆盖。 分析其原因,update不带子查询情况下会根据查询条件会加行锁,保证数据一致性,其他update语句要等其事务提交才能读取改行数据。 update带子查询情况下,查询过程不加锁,查询结果返回给update时才加锁,相当于先select ,再更新的过程。此时别的session update也会查询到该条记录,最后等到3事务提交时执行就会覆盖掉之前的数据。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |