`

怎样消除多事务并发问题?

阅读更多

多事务并发,大家在实际的项目或者产品开发过程中会常常遇到。

 

在开发过程中,如果业务中有必须唯一性的业务单元,例如:消息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采用版本控制实现乐观锁的处理。

4
0
分享到:
评论
5 楼 charles751 2008-11-13  
teclogid:
如果是查询后发update,那发这个update之前事务1没完成,你这个update失败,如果完成了,那就是先后两个事务了,当然后面的修改覆盖前面的。

1.查询当然不能更新。
2.事务2的update不一定失败,有可能事务2暂时让出CPU时间,处于暂停状态。
3.这种场景下不是先后两个事务,因为这两个事务是同时开始的。
4 楼 charles751 2008-11-11  
谢谢你,wangxuliangboy
你说的没错。

下面的是我没有说清楚,已经改正了,呵呵。

select * from sometable where id = 1 for update;
1.1允许对表中的其他记录做普通查询,但不允许做for update查询。

改为:
1.1不允许对该记录做for update查询,允许对其他记录做for update查询。
3 楼 wangxuliangboy 2008-11-11  
是的..我没提交事务...
select * from product where id ='10006924' for update

select * from product where id='10001407' for update
我觉的是行级锁..只会锁得当前行..而不会影响其它的FOR UPDATE
2 楼 charles751 2008-11-11  
能说说你是怎么测试的吗?

下面这条查询,你是怎么执行的,确认该事务尚未提交吗?
select * from sometable where id = 1 for update
1 楼 wangxuliangboy 2008-11-11  
允许对表中的其他记录做普通查询,但不允许做for update查询。

为什么我在PL/SQL中可以做呢...

相关推荐

    48 多个事务并发更新以及查询数据,为什么会有脏写和脏读的问题?l.pdf

    标题和描述中提到的核心知识点是关于数据库事务并发控制中可能出现的问题,特别是脏写(Dirty Write)和脏读(Dirty Read)两种现象。这些知识点主要涉及数据库事务的隔离级别,事务的ACID属性(原子性、一致性、...

    redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS 方案吗?

    redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS 方案吗?

    MySQL中如何处理并发写入问题?

    通过合理地使用事务,可以避免多个并发写入操作相互冲突。 在 MySQL 中,事务可以分为两个阶段:prepare 阶段和 commit 阶段。在 prepare 阶段,MySQL 会将事务中的所有操作执行一遍,并生成一个事务 ID。在 commit...

    Hibernate事务和并发控制

    至于并发控制,主要目的是解决多用户同时访问同一数据时可能出现的问题,如脏读、不可重复读和幻读等。在数据库层面,常见的并发控制机制包括锁和乐观锁。Hibernate提供了多种并发策略,如版本字段(version)和...

    事务并发访问及隔离机制

    事务并发带来的坏处,以及通过设置事务隔离级别来处理

    行业-48 多个事务并发更新以及查询数据,为什么会有脏写和脏读的问题?l.rar

    当多个事务并发运行时,可能会出现脏写(Dirty Write)和脏读(Dirty Read)的问题,这是并发控制中的两个主要问题。本文将深入探讨这两个概念以及它们产生的原因。 脏写是指一个事务修改了另一个事务尚未提交的...

    深入理解分布式事务,高并发下分布式事务的解决方案

    本文来自于csdn,本文主要从分布式的原因,事务特性,和解决方案中深入理解了分布式事务,希望对您的学习有所帮助。 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的...

    分布式事务的并发控制

    分布式事务并发控制是分布式系统中确保多个参与节点间事务一致性的关键技术。在分布式系统中,事务可能需要同时在多个服务器上执行,这就要求系统能够在这些服务器之间进行协调,以保证事务的ACID属性(原子性、一致...

    并发事务的可串行性b

    了解事务并发在开发中的应用和引起并发的原因

    Oracle并发问题处理

    通过这种方式,可以有效避免多个事务之间因并发操作而产生的数据冲突问题。 - **实现方法**:在Oracle中,可以通过`SELECT ... FOR UPDATE NOWAIT`语句来实现。例如: ```sql SELECT * FROM EMP WHERE EMPNO = ...

    第10章-事务管理:并发控制与恢复

    并发控制是为了防止多个事务同时执行时出现的问题,如丢失修改、脏读和不可重复读。例如,在飞机订票系统中,如果没有并发控制,同一航班的票可能会被超售。解决这些问题的技术有多种,包括: 1. 封锁技术:通过锁定...

    数据库的事务处理与并发控制

    数据库处理的经典资料: 叫你处理事务 如何并发处理 瞧瞧吧 机不可失哟

    LINQ to SQL语句(13)之开放式并发控制和事务

    并发控制是多用户环境下数据库系统必须解决的关键问题,以确保数据的一致性和完整性。在LINQ to SQL中,开放式并发控制是通过比较对象的原始状态(保存在数据上下文中的`OriginalValues`集合)与数据库中的当前状态...

    pgsql的并发问题

    在探讨"pgsql的并发问题"时,我们深入研究了PostgreSQL如何处理并发操作以及如何确保在不影响性能的情况下,应用程序查询能够获得正确的结果。这涉及到的关键概念包括多版本并发控制(MVCC)、两阶段锁定(2PL)以及...

    处理多用户更新数据并发问题 编程小实例

    总之,处理多用户更新数据并发问题需要综合运用数据库事务、线程同步、并发控制策略以及良好的编程实践。C++.NET提供了丰富的工具和库,使得开发者能够有效地解决这些问题。通过深入理解并实践这个编程小实例,你将...

    Hibernate 事务和并发控制

    在多用户环境下,同时访问同一数据可能会引发并发问题,如脏读、不可重复读和幻读。Hibernate提供了一些策略来解决这些问题,包括乐观锁和悲观锁。 乐观锁假设并发冲突很少发生,通常在数据更新时检查版本号或...

    事务并发的可能问题与其解决方案.docx

    总结来说,事务并发的问题主要围绕数据的一致性和完整性,而解决这些问题的关键在于选择合适的事务隔离级别和实施有效的锁定策略。通过理解这些概念和技术,开发者可以更好地设计和优化数据库系统,确保在高并发环境...

    事务和并发控制

    该PPT讲解,事务,嵌套事务,保存点,乐观并发控制及时间戳

Global site tag (gtag.js) - Google Analytics