在整理应用中旧系统数据移植的问题,发现表中出现了几条异常记录,记录除主键不同外,记录的时间和其它内容完全一致。
业务本身的逻辑是,如果碰到数据库中有相关的记录需要把这些记录置为无效,然后插入一条记录。现在是出现了二条有效的记录,是违背业务逻辑本意的。
猜测问题可能出在
1、重复提交表单引起的
2、两个人同时进行相同的操作引起的
3、由于生产环境使用了集群,当不同的人访问不同的集群上的节点时,也会导致这个问题
避免1,2,系统改动不会太大,如果避免3引起的问题,就不是那么好搞了。
市检办案系统虽然使用的人不是太多,但是有些模块会有集中使用的情况,由3导致问题的机率也会增大。
--trancation start
update tab set flag=2 where flag=1 and id=10;
insert into tab values(1,10);
--trancation complete
两个事务并行时,两个事务同时运行到update 语句,由于表中并没有满足条件的记录,update语句并没有使其中的一个事务挂起。这时就出现两条相同数据的语句。
如果说update时,数据表中有满足条件的语句,由于获取不到相同行的排他锁,其中一个事务是会被挂起的,就相当两个事务是串行的了。
初次解决方案(失败):
1、可以把事务的隔离级别设为Serializable(Oracle缺省是Read committed);
如果update没有更新记录,是不存在幻想读的。
(一个事务中,查询时看到了另一个已完成事务的插入记录),update时,由于更新为0,所以不会导致事务失败。还是会有两条相同记录插入到了表中。
serializable并不是对事务串行执行。可以考虑用锁,比如在另一张表t_mylock中放一条记录,永久不删,事务开始时使select * from t_mylock for update。让事务真正串行
--trancation start
--set transaction isolation level serializable;
select * from t_mylock for update;
update tab set flag=2 where flag=1 and id=10;
insert into tab values(1,10);
--trancation complete
ps: serializable 可能会报不能序列化访问的错误,在实际应用中可能不太合适。
ora-08177 :cann't serialize access for this transaction
如果update时,更新了其它事务提交的记录(当前事务开始时还看不到这条记录)就会报这个错。
解决方案:
2、使用select t from table_lock for update 及在数据库端使用锁,这条语句有一个前提是必须要有记录,才能起到阻塞的效果。
--trancation start
select id from table_mylock where id=1 for update;(表table_mylock中有满足条件的记录)
update tab set flag=2 where flag=1 and id=10;
insert into tab values(1,10);
--trancation complete
分享到:
相关推荐
并发控制的主要目标是避免事务之间的冲突,防止出现诸如脏读、不可重复读和幻读等问题。 脏读发生在事务T1读取了事务T2还未提交的修改数据,然后T2因为某种原因回滚了更改。在这种情况下,T1读到的数据实际上是错误...
这样,事务B就“读取”了脏数据,即脏读。 为了解决这些问题,数据库系统采用事务隔离级别。在SQL标准中,定义了四种事务隔离级别: 1. 读未提交(Read Uncommitted):最低的隔离级别,允许事务读取未提交更改的...
如果数据库设计和应用程序开发中没有妥善处理并发问题,则可能出现数据不一致、脏读等问题,甚至导致系统性能下降。因此,理解并发问题的本质及其处理机制对于维护数据完整性和提高系统稳定性至关重要。 #### 并发...
当多个用户同时尝试修改同一数据时,如果没有适当的控制机制,可能会导致数据不一致、丢失更新或死锁等问题。以下是一些处理多用户更新数据并发问题的关键知识点: 1. **并发控制**:并发控制是数据库管理系统中的...
当多个用户同时访问数据库时,如果没有适当的并发控制机制,可能会导致数据不一致、更新丢失或脏读等问题。本文将探讨如何设计有效的数据库并发控制机制。 数据库的并发控制是确保在多用户环境中数据库的完整性和...
当多个事务并发运行时,可能会出现脏写(Dirty Write)和脏读(Dirty Read)的问题,这是并发控制中的两个主要问题。本文将深入探讨这两个概念以及它们产生的原因。 脏写是指一个事务修改了另一个事务尚未提交的...
并发问题通常发生在多个用户或进程同时访问和修改同一数据时,可能导致数据不一致或死锁。在 Informix 数据库管理系统中,有多种策略可以用来解决这些问题。 首先,提到的案例是一个智能通知存款业务,涉及对个人...
并发问题在数据库环境中是常见的挑战,特别是在多用户系统中,多个事务可能会同时访问和修改同一份数据,导致数据一致性的问题。以下将详细阐述并发问题及其解决方案。 首先,我们需要理解并发问题的四大类型: 1....
并发事务可能会引发多种问题,如更新丢失、脏读、不可重复读和幻读,这些问题都需要通过适当的事务隔离级别和解决方案来处理。 更新丢失分为第一类更新丢失和第二类更新丢失。前者发生在事务撤销时,其对数据的修改...
2. **事务问题**:Redis的事务(MULTI/EXEC)不具备ACID特性中的隔离性,可能导致脏读、不可重复读或幻读等问题。 3. **发布/订阅模式**:在发布/订阅模式下,消息的顺序可能因客户端的处理速度不同而被打乱,造成...
在现代数据库管理系统(DBMS)中,**并发控制**是一项关键的技术,尤其是在多用户环境中,它确保了多个事务能够同时访问数据库而不会导致数据不一致的问题。SQL Server 2000作为一款广泛使用的数据库管理系统,提供...
在多用户系统中,多个事务可能同时访问和修改相同的数据,如果不采取适当的措施,将可能导致数据不一致的问题。因此,数据库管理系统(DBMS)必须具备有效的并发控制机制来管理这些并发操作。 ### 并发操作可能引发...
1. 读未提交(Read Uncommitted):允许读取其他事务尚未提交的数据,可能导致脏读。 2. 读已提交(Read Committed):每次读取都是事务开始后已经提交的数据,可防止脏读,但可能出现不可重复读。 3. 可重复读...
并发访问可能导致数据的不一致性,进而影响系统的稳定性和可靠性。因此,数据库管理系统必须具备有效的并发控制机制。 #### 数据库并发控制的重要性 数据库并发控制是指在多用户环境下,当多个事务试图同时访问或...
并发控制的主要目的是防止多个事务在访问共享资源时产生不正确的数据状态,从而避免诸如丢失更新、脏读和不可重读等并发问题。 1. **数据库并发控制的含义** 并发控制是指在多用户环境下,当多个事务同时访问和...
1. **读未提交**(Read Uncommitted):最低的隔离级别,事务可以看到其他未提交事务的更改,可能导致脏读。 2. **读已提交**(Read Committed):事务只能看到已经提交的更改,避免了脏读,但在并发情况下可能导致...
这在提升性能的同时,也引入了并发控制的挑战,因为多个用户可能会同时修改同一份数据的副本,导致数据冲突。 当两个或更多的用户尝试更新同一数据库记录,而没有考虑到其他用户可能进行的更改时,就会出现数据并发...
当这些事务并发地存取数据库时,如果不加以控制,可能会导致数据的丢失修改、不可重复读和读脏数据这三类数据不一致。丢失修改是指一个事务的修改被另一个事务覆盖;不可重复读则是在同一事务中多次读取同一数据得到...
通过使用封锁机制,可以在一定程度上解决并发操作带来的问题,尤其是丢失修改、不可重复读和读脏数据等问题。但是,封锁也会引入新的问题,比如死锁等,因此在实际应用中需要根据具体情况选择合适的封锁策略。 ####...