论坛首页 综合技术论坛

db2v8 update嵌套子查询的问题

浏览 2807 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-14  
最近在作项目中发现了一个问题,以前对update了解不深,特将此问题总结如下:
数据库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事务提交时执行就会覆盖掉之前的数据。



论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics