论坛首页 Java企业应用论坛

遇到一个多事务并发的问题

浏览 12485 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-22  
charles qi 写道
今天遇到一个多用户并发的问题,顺便对for update做下测试。以下是在oracle10下的测试结果:

1.在查询某一条记录的sql上,加上for update。
例如:select * from sometable where id = 1 for update;

1.1 允许对该记录做普通查询;不允许对该记录做for update查询,允许对其他记录做for update查询。
1.2 允许对其他记录做普通sql的update;不允许update锁定的该条记录。
1.3 允许insert操作。
1.4 允许delete操作,不允许对锁定记录做delete操作。


2.在查询表的所有记录的sql上,加上for update。
例如:select * from sometable for update;

2.1 允许普通search查询,不允许做for update查询。
2.2 不允许对表中任何记录做update操作;
2.3 允许insert操作;
2.4 不允许delete操作。

另外,update和insert语句加上for update报语法错误。


扩展开来:
由1.1可以设想如下一个场景:

现在有两个事务,操作同一条记录Ar,执行过程如下:
事务1:执行for update查询,然后更新字段Ac,最后提交;
事务2:执行普通查询,然后更新字段A,最后提交。

两个事务执行完毕,得到的记录Ar的字段Ac的值肯定是错误的。

面对这种情况,大家都是怎么处理的呢?



方法1.
事务1: UPDATE SQL
事务2: UPDATE SQL

方法2.
事务1: UPDATE SQL
事务2: SELECT FOR UPDATE
0 请登录后投票
   发表时间:2008-11-25  
charles qi 写道
如果事务2在另一个系统中,执行的是普通的查询,并且没有for update,
除了给它加上for update,还有其他办法吗?

既然是一个事务,执行更新前一定要用for update判断一下这一行是否被其它会话锁定
顺便说一句可以用for update nowait 防止session阻塞
0 请登录后投票
   发表时间:2008-12-21  
http://case0079.iteye.com/blog/205201
0 请登录后投票
论坛首页 Java企业应用版

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