锁定老帖子 主题:遇到一个多事务并发的问题
精华帖 (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 |
|
返回顶楼 | |
发表时间:2008-11-25
charles qi 写道 如果事务2在另一个系统中,执行的是普通的查询,并且没有for update,
除了给它加上for update,还有其他办法吗? 既然是一个事务,执行更新前一定要用for update判断一下这一行是否被其它会话锁定 顺便说一句可以用for update nowait 防止session阻塞 |
|
返回顶楼 | |
发表时间:2008-12-21
http://case0079.iteye.com/blog/205201
|
|
返回顶楼 | |