多事务并发,大家在实际的项目或者产品开发过程中会常常遇到。
在开发过程中,如果业务中有必须唯一性的业务单元,例如:消息ID,订单ID等,这时开发人员就需要考虑:多事务并发时,会不会产生错误的执行结果,对具体问题具体分析,进而得到合理的解决方案。
我在项目中遇到过多个多用户并发的问题,顺便对Oracle中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 允许普通select查询,不允许做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的值有可能是错误的。
这说明仅在sql中添加for update是无法消除多用户并发问题的。
暂且这么说,因为如果整个系统对于特定的数据,都采取统一的锁机制,是可以避免这个问题的,例如:一个大系统的所有子系统,对于表A的操作都统一的采用悲观锁或者乐观锁的机制。
多事务并发问题多出现在一个系统中没有明确的事务操作规则,而且开发人员的编码水平参差不齐,有的人没有想到需要做这样的处理,就容易造成并发问题。
锁机制的指定:
数据库的锁机制有多种管理方式,数据库本身提供自动管理机制;另外,也允许用户在事务中指定具体应用哪种锁,例如:在sql中添加for update,在具备锁机制的DB中的意思就是指定对当前查询的数据记录应用独占锁。
其实解决多事务并发的问题方法有多种,这里只提下version处理机制,它不仅适用于单个系统,而且即便是分布式系统也没问题。有经验的用户都比较了解这种方式,就不再多说了,可参考hibernate采用版本控制实现乐观锁的处理。
分享到:
相关推荐
48 多个事务并发更新以及查询数据,为什么会有脏写和脏读的问题?l.pdf
redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS 方案吗?
事务并发带来的坏处,以及通过设置事务隔离级别来处理
Hibernate事务和并发控制Hibernate事务和并发控制Hibernate事务和并发控制
本文来自于csdn,本文主要从分布式的原因,事务特性,和解决方案中深入理解了分布式事务,希望对您的学习有所帮助。 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的...
了解事务并发在开发中的应用和引起并发的原因
行业-48 多个事务并发更新以及查询数据,为什么会有脏写和脏读的问题?l.rar
数据库处理的经典资料: 叫你处理事务 如何并发处理 瞧瞧吧 机不可失哟
该PPT讲解,事务,嵌套事务,保存点,乐观并发控制及时间戳
数据库思维导图——并发控制 并发控制 多事务执行方式 (1)事务串行执行 每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行 不能充分利用系统资源,发挥数据库共享资源的...事务并发执行带来的问题
Hibernate事务与并发问题处理.pdf
事务并发的可能问题与其解决方案.docx
hibernate 对事务并发处理
LINQ to SQL语句(13)之开放式并发控制和事务
J2EE事务并发控制策略总结 当前J2EE项目中,面临的一个共同问题就是如果控制事务的并发访问,虽然有些持久层框架已经为我们做了很多工作,但是理解原理,对于我们开发来说还是很有用处
Hibernate事务与并发问题处理[收集].pdf
Hibernate事务和并发控制 实例,想深入理解Hiberante的朋友,可以去研究一下。
这是一节关于研究生研一分布式设计课程中的课件,里面的内容是关于分布式事务的并发控制。
非常浅显的讲述《资源竞争与并发控制》。 1.应用层并发控制?不是重点 2.Lost Update?乐观锁与悲观锁 3.隔离级别:脏读Dirty Read+幻读Phantom Read 4.InnoDB锁与多版本控制? 5.意向锁? 6.事务传播行为?