你讨论的是事务并发的问题
对于这种问题,为了保持数据的一致性一般都是先用select ... for update no wait 来加行占锁,其他的sesssion只能等到最先用户事务提交之后才能更新,这样就保证了数据一致性
对于这种问题,为了保持数据的一致性一般都是先用select ... for update no wait 来加行占锁,其他的sesssion只能等到最先用户事务提交之后才能更新,这样就保证了数据一致性
解决方案 »
- 如何用ORACLE 11g实现分布式数据库
- dbms_scheduler的repeat_interval设置问题
- oracle10g导出出错
- 问题真难,高手来帮助一下吧!送1000分都可以。
- 深圳朋友过来了,因为个人要搬家,图书大甩卖!!!很多技术类好书!先到先得!
- 字段后面跟(+)是什么意思?
- 请问这样的语句该怎么写?
- 哪位不太提问题,可用分又多的朋友,给捐些可用分?我想把问题都分开贴子来提问,把分数给得合理一点。先谢了。
- 为什么登录Enterprise Manager Console时出错?
- 如何在一个数据库中建立两个实例(ORACLE 8.17)
- 监听器为什么会自动停止?????
- Oracle学习
事务A在执行的过程中,事务B是可以进行Select操作的,那么B计算出来的结果和A计算出来的结果还是一致的。我现在就是想在事务A执行的时候,事务B不能执行,只有等A执行完后,才可以,也就是说Select也不可以执行。
http://www.akadia.com/services/ora_locks_survival_guide.html
An exclusive table lock permits other transactions only to query the table.所以,即使最严格的锁也无法禁止别的transaction访问(select)你的表,除非revoke select privilege,但是这种做法我个人觉得不是很好
select ....for update wait 10//得到原有值
;;;;// 计算新的编号
update ...// 更新表
--commit;session B:
select ....for update wait 10//得到原有值
;;;;// 计算新的编号
update ...// 更新表
--commit;假设A在B之前执行,且A未提交事务时B开始执行(即发生事务并发),这个时候因为select for update把目标表中符合条件select出来的row都给锁住了,B可以只读访问,但是无法更改被锁住的行,当B update的时候,B不得不等待,如果A 在B运行update10分钟之内提交的话,那么B的update语句就会被执行,否则到了10分钟之后A还没有提交B就强制失败,并且结束所有的操作,等于对数据库没有更新,只要A不结束事务,那么锁住的记录将会永远被锁住
我后来也发现这个问题了,
没仔细看这个问题,只要能确保锁同一条记录就可以了。
揭帖