事务并发的异常:
更新丢失:
当两个或多个事务选择同一数据,并且基于最初选定的值更新该数据时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。事务1与事务2先后读入同一数据A=16,事务1执行A-1,并将结果A=15写回,事务2执行A-1,并将结果A=15写回。事务2提交的结果覆盖了事务1对数据库的修改,从而使事务1对数据库的修改丢失了。
读脏数据:
一个事务读取了另一个未提交的并行事务写的数据。当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。当事务1修改某一数据,并将其写回磁盘,事务2读取同一数据后,事务1由于某种原因被撤销,这时事务1已修改过的数据恢复原值,事务2读到的数据就与数据库中的数据不一致,是不正确的数据,称为脏读。
不可重复读:
一个事务重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务修改过。即事务1读取某一数据后,事务2对其做了修改,当事务1再次读数据时,得到的与第一次不同的值。
幻影读:
如果一个事务在提交查询结果之前,另一个事务可以更改该结果,就会发生这种情况。这句话也可以这样解释,事务1按一定条件从数据库中读取某些数据记录后未提交查询结果,事务2删除了其中部分记录,事务1再次按相同条件读取数据时,发现某些记录神秘地消失了;或者事务1按一定条件从数据库中读取某些数据记录后未提交查询结果,事务2插入了一些记录,当事务1再次按相同条件读取数据时,发现多了一些记录。
针对以上种种异常,标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 。
未授权读取(Read Uncommitted):也称未提交读。如果一个事务已经开始写数据则另外一个数据则不允许同时进行写操作但允许其他事务读此行数据。该隔离级别可以通过排他锁实现,但是不添加共享锁,所以其它trasaction 可以在trasaction A对记录的读取过程中修改同一记录,可能会导致A读取的数据是一个被破坏的或者说不完整不正确的数据。
另外,在trasaction A中可以读取到trasaction B(未提交)中修改的数据。比如trasaction B对R记录修改了,但未提交。此时,在Trasaction A中读取R记录,读出的是被B修改过的数据。
2. 授权读取(Read Committed):也称提交读。读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将会禁止其他事务访问该行。通过共享锁和排它锁实现,在trasaction A中读取数据时对记录添加共享锁,但读取结束立即释放。其它transaction 对这个记录的试图修改会一直等待,直到A中的读取过程结束,而不需要整个trasaction A的结束。所以,在trasaction A的不同阶段对同一记录的读取结果可能是不同的,即不可重复读。
3. 可重复读取(Repeatable Read):读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。通过共享锁和排他锁实现,对于读出的记录,添加共享锁直到transaction A结束。其它transaction 对这个记录的试图修改会一直等待,直到trasaction A结束。当执行一个范围查询时,可能会发生幻读。
4. 串行化(Serializable):也称可串行读。提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现,通过添加范围锁,直到transaction A结束。
对数据库使用何种隔离级别要审慎分析,因为维护一个最高的隔离级别虽然会防止数据的出错,但是却导致了并行度的损失,以及导致死锁出现的可能性增加。然而,降低隔离级别,却会引起一些难以发现的bug。以下是对于各种异常和事务隔离级别的共生矩阵。
隔离级别 脏读 不可重复读 幻读
未提交读(read uncommitted) 可能 可能 可能
读已提交(read committed) 不可能 可能 可能
可重复读(repeatable read) 不可能 不可能 可能
可串行化(serializable ) 不可能 不可能 不可能
而对于实现以上四种的级别是通过加锁的方式实现的,加不同的锁,不同的锁的组合,以及加锁时机和释放的时机是实现的关键。注意这里提到的大部分的锁都是在数据行的上的锁,只有在最高级别的隔离级别上才会有表级锁。以下是些锁的分享。
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。
对于oracle数据库的锁,根据保护的对象不同,可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。
DML锁的目的在于保证并发情况下的数据完整性。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
分享到:
相关推荐
关于事务隔离级别,不同的级别适用于不同的场景,开发者应该根据实际业务需求和系统并发要求来选择合适的隔离级别,以保证数据的一致性同时尽可能提高系统的性能。 通过了解和使用这些隔离级别,开发者能够更好地...
查询:默认事务隔离级别 mysql> select @@tx_isolation;当前会话的默认事务隔离级别 mysql> select @@session.tx_isolation;当前会话的默认事务隔离级别 mysql> select @@global.tx_isolation;全局的事务隔离级别
MySQL事务隔离级别是数据库管理系统中一个非常重要的概念,它关系到数据的一致性和并发性能。在MySQL中,事务被用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。事务隔离级别主要涉及四个方面:读...
事务传播特性&事务隔离级别 事务传播特性是指在 Java 中,事务的传播行为,即在多个事务之间如何交互和传播。Java 中有七种事务传播特性,分别是: 1. PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务。...
MySQL数据库管理系统提供了四种事务隔离级别来处理事务并发中可能遇到的问题。事务并发问题通常包括脏读、不可重复读和幻读。 一、事务的基本要素(ACID) 事务具有四个基本要素,即原子性(Atomicity)、一致性...
介绍数据库事务的四种隔离级别,比较不同隔离级别的区别和影响
事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置; 事务隔离级别 事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互...
Hibernate 事务隔离级别 深入探究 在 Hibernate 中,事务隔离级别是指数据库系统提供的一种机制,以解决并发事务带来的问题。为了确保数据库的可靠性和一致性,Hibernate 提供了四种事务隔离级别,分别是 ...
### Spring 事务传播特性和事务隔离级别详解 #### 一、Spring 事务传播特性 在进行多层服务架构设计时,事务的管理尤其重要。为了确保数据的一致性,Spring 提供了一种灵活的方式来控制事务的传播行为。下面详细...
数据库事务和隔离级别
Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...
SQL Server的锁机制和事务隔离级别是数据库管理系统中确保数据一致性、避免并发问题的重要机制。在SQL Server中,锁主要用于控制多个用户同时访问同一数据时的并发操作,而事务隔离级别则是确定在事务中如何处理这些...
在多用户并发访问数据库系统时,事务隔离级别的设置对于保障数据一致性与系统并发性能之间至关重要。本文档详细探讨了SQL Server中不同事务隔离级别的实验研究,揭示了各隔离级别与锁管理之间的关系,并通过实验验证...
### Spring事务的传播特性和事务隔离级别 #### 一、Spring事务的传播特性(Propagation) 在Spring框架中,事务管理不仅提供了ACID属性的支持,还引入了事务的传播特性,这些特性决定了当一个方法调用另一个方法时,...
深入理解Mysql事务隔离级别与锁机制 Mysql事务隔离级别与锁机制是数据库系统中非常重要的概念,它们都是为了解决多事务并发问题而设计的。下面我们将深入讲解这些机制,让大家彻底理解数据库内部的执行原理。 事务...
在SQL92标准中,定义了四种事务隔离级别,分别是读未提交(Read Uncommitted)、读提交(Read Committed,简称RC)、可重复读(Repeated Read,简称RR)以及串行化(Serializable)。InnoDB存储引擎实现了这四种隔离...
**事务隔离级别** 在计算机科学,尤其是数据库管理系统(DBMS)的设计中,事务隔离级别是确保数据一致性、避免并发操作导致的问题的关键概念。事务是一系列数据库操作的逻辑单元,它们要么全部成功,要么全部失败。...
【事务隔离级别】 在计算机科学,特别是在数据库管理系统(DBMS)中,事务隔离级别是确保数据库并发操作一致性的重要概念。事务是一系列数据库操作的逻辑单元,必须作为一个整体执行,要么全部成功,要么全部失败。...
MySQL 支持四种事务隔离级别:READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和 SERIALIZABLE(串行化)。每种隔离级别对应不同程度的事务并发问题的防范,其中,MySQL ...