2007-07-14
db2v8 update嵌套子查询的问题
关键字: db2 sql update
最近在作项目中发现了一个问题,以前对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事务提交时执行就会覆盖掉之前的数据。
数据库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事务提交时执行就会覆盖掉之前的数据。
- 浏览: 77022 次
- 性别:

- 来自: BJ

- 详细资料
搜索本博客
最新评论
-
代码生成工具
晕,肯定要多用撒,省下时间
-- by xfan1982 -
eclipse开发提高coding ...
我估计评新手贴的楼主说的1/3 都没记住
-- by ddbird -
转载:做天难做二月天、做 ...
我觉得周这个人其实没有多难,其实很多的中国老百姓比他要难多了,好多人饿死了,冻死 ...
-- by wangpx -
应用的集群部署
你好: 想请教一下在GLASSFISH或APPSERVER中如何将数据库 ...
-- by yunseu -
作技术?作业务?
如果是面向软件服务,就是行业性软件公司。 大部分公司都是这样的,靠卖人、卖方案、 ...
-- by Godlikeme






评论排行榜