`

事物隔离层简介

 
阅读更多

隔離性是交易的保證之一,表示交易與交易之間不互相干擾,好像同時間就只有自己的交易存在一樣,隔離性保證的基本方式是在資料庫層面,對資料庫或相關欄位鎖定,在同一時間內只允許一個交易進行更新或讀取。

先來看看沒有對資料庫進行鎖定下,可能發生的問題:

  • 更新遺失(lost update)
基本上就是指某個交易對欄位進行更新的資訊,因另一個交易的介入而遺失。

例如,兩個以上交易在進行同一欄位的更新時,若沒有對欄位進行鎖定,若交易A進行COMMIT,交易B因故ROLLBACK,則交易A所作的更新就會發生遺失的問題:
  1. 交易A更新欄位1
  2. 交易B更新欄位1
  3. 交易A COMMIT
  4. 交易B ROLLBACK
另一種可能的情況是,如果交易A在交易B前後進行更新與COMMIT,則交易B所作的更新將會遺失,又稱為二次更新遺失(second lost update),例如:
  1. 交易A更新欄位1
  2. 交易B更新欄位1
  3. 交易B COMMIT
  4. 交易A COMMIT
在以上的情況,交易B所進行的更新將會遺失。


  • 髒讀(dirty read)
兩個交易同時進行,其中一個交易更新資料,另一個交易讀取了尚未COMMIT的資料,就有可能發生髒讀問題。例如:
  1. 交易A更新欄位1
  2. 交易B讀取欄位1
  3. 交易A ROLLBACK
  4. 交易B COMMIT
在以上的情況下,交易B讀取的是不正確的資料。


  • 無法重複的讀取(unrepeatable read)
某個交易兩次讀取同一欄位的資料並不一致,例如,如果交易A在交易B前後進行資料的讀取,則會得到不同的結果。
  1. 交易A讀取欄位1
  2. 交易B更新欄位1
  3. 交易B COMMIT
  4. 交易A讀取欄位1
在以上的情況,交易A讀取兩次欄位1,但卻得到不同的結果。


  • 幻讀(phantom read)
如果交易A進行兩次查詢,在兩次查詢之中有個交易B插入一筆新資料或刪除一筆新資料,第二次查詢時得到的資料多了第一次查詢時所沒有的筆數,或者少了一筆。
  1. 交易A進行查詢得到五筆資料
  2. 交易B插入一筆資料
  3. 交易B COMMIT
  4. 交易A進行查詢得到六筆資料


隔離交易的基本方式是鎖定資料庫,但完全的鎖定資料庫實務上並不會這麼作,因為完全的鎖定資料庫將導致嚴重的效能問題,因此實務上會根據資料讀寫更新的頻繁性,設定不同的交易隔離層級(transaction isolation level):

  • read uncommited
簡而言之,某個交易可以讀取另一個交易已更新但尚未commit的資料,所以允許dirty read,但不允許lost update,也就是允許交易B讀取交易A更新尚未COMMIT的資料,但在交易A進行COMMIT前,不允許其它交易再寫入(也就是寫入鎖定)。

這個隔離層級讀取錯誤資料的機率太高,一般不會採用這種隔離層級。

讀取的交易不會阻止其它的交易,一個未COMMIT的交易會阻止其它寫入的交易。
  • read commited
比read uncommited嚴格一些,簡而言之,某個交易僅可讀取另一個交易已commit的資料,所以允許unrepeatable read,但不允許dirty read,一筆交易正在讀取資料時,允許另一筆交易進行資料寫入,但不允許已經dirty的資料被讀取或寫入(shared read lock, exclusive write lock)。

讀取的交易不會阻止其它的交易,一個未COMMIT的交易會阻止其它所有的交易。
  • repeatable read
比read commited嚴格,在一個交易己讀取的資料,不允許其它交易進行資料寫入,不允許unrepeated read,但phantom read還是可能發生。

讀取的交易不會阻止其它讀取的交易,但會阻止其它寫入的交易,而寫入的交易會阻止所有其它的交易。
  • serializable
最嚴格的隔離層級,同一筆資料一次只能有一個交易,無法讓交易並行處理。


read uncommited出錯的機率太大,大部份的應用程式會選用read commited或repeatable read的隔離層級,而serializable執行完全的鎖定,嚴重傷害系統效能。

真正的鎖定系統是在資料庫系統上實作的,依各家廠商而有所不同,必須參考廠商的說明書,了解不同的隔離層級對應用程式的效能與擴展性有何影響。

以下整理隔離層級對多個交易並行處理的影響,YES表示會發生問題:

隔離層級 Dirty Read Unrepeatable Read Phantom Read
Read uncommitted YES YES YES
Read committed NO YES YES
Repreatable read NO NO YES
Serializable NO NO NO
分享到:
评论

相关推荐

    SPRING事务传播特性&事务隔离级别

    ### Spring 事务传播特性和事务隔离级别详解 #### 一、Spring 事务传播特性 在进行多层服务架构设计时,事务的管理尤其重要。为了确保数据的一致性,Spring 提供了一种灵活的方式来控制事务的传播行为。下面详细...

    Mysql事务的隔离性

    ### MySQL事务的隔离性 #### 一、事务与MySQL架构 **事务**是数据库管理系统执行过程中的一系列逻辑操作,这些操作作为一个完整的单元被执行。如果事务内的所有操作都成功完成,则整个事务成功;如果其中一个操作...

    DAL隔离层

    **DAL(Data Access Layer)隔离层** 在软件开发中,数据访问层(DAL)是应用程序架构中的一个重要组成部分,它的主要职责是处理与数据库的交互,包括数据的读取、写入、更新和删除等操作。DAL隔离层的设计旨在提供...

    02.Spring支持的常用数据库事务传播属性和事务隔离级别.zip

    本资料主要探讨的是Spring支持的数据库事务传播属性和事务隔离级别。 一、事务传播属性 1. REQUIRED(默认):如果当前存在事务,则加入该事务;如果没有事务,则创建一个新的事务。这是最常见的事务定义,适用于...

    Spring 注解学习手札(五) 业务层事务处理

    Spring支持五种事务隔离级别,包括`DEFAULT`、`READ_UNCOMMITTED`、`READ_COMMITTED`、`REPEATABLE_READ`和`SERIALIZABLE`,它们决定了不同事务之间数据可见性的策略。 4. **事务的回滚规则** 默认情况下,运行时...

    10分钟解决Hibernate的事务管理,Hibernate当中要设置事务的隔离级别

    本文主要关注于使用Hibernate进行事务管理和设置事务隔离级别的知识。Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库操作,同时也提供了对事务的管理。 首先,我们需要理解事务的基本概念。...

    SpringBoot事务和Spring事务详讲

    每个事务在其执行过程中,应与其他事务隔离,以避免数据损坏。 4. **持久性 (Durability)**:一旦事务成功完成,其效果将是永久性的,即使之后系统出现故障也不会受到影响。 #### 四、Spring 事务管理 Spring 提供...

    jee事务控制.pdf

    ### J2EE事务控制详解 ...通过选择合适的事务隔离级别,并结合乐观锁或悲观锁等策略,可以有效提高系统的并发性能和数据一致性。在实际应用中,开发者应根据业务需求和性能要求灵活选择最佳方案。

    spring的隔离级别

    接下来,我们将深入探讨`@Transactional`注解以及Spring中的事务隔离级别。 1. **什么是事务** 事务是数据库操作的基本单元,它确保一组数据库操作要么全部成功,要么全部失败。事务的存在是为了维护数据库的一致...

    java事务处理详解

    此外,Spring的事务处理还提供了多种事务隔离级别,包括: * ISOLATION_DEFAULT:使用数据库的默认隔离级别。 * ISOLATION_READ_UNCOMMITTED:允许读取未提交的数据。 * ISOLATION_READ_COMMITTED:只允许读取已...

    在多层结构中利用事务处理保证数据的一致性

    3. **隔离性(Isolation)**:事务之间是相互隔离的,即一个事务的操作不会影响其他正在执行的事务。这意味着即使多个事务同时进行,也必须如同单个事务依次执行一样。 4. **持久性(Durability)**:一旦事务提交...

    spring事务详解

    - 事务隔离级别:定义了事务的隔离水平,例如读未提交、读提交、可重复读和串行化。 - 只读事务:通过设置事务为只读模式,可以提高事务的性能,尤其是对于那些只进行数据读取操作的事务。 - 超时设置:可以为事务...

    若依框架分布式事务配置和项目启动手册

    - 开启事务注解:在需要事务控制的Service或Controller层方法上添加@Transactional注解。 4. **项目启动流程** - 环境部署:首先,确保所有依赖服务(如数据库、消息队列、配置中心等)正常运行。 - 应用启动:...

    Java事务设计模式_java_事务设计模式_

    例如,使用Spring的PlatformTransactionManager接口,通过TransactionTemplate或直接在Service层使用@Transactional注解进行事务管理。 3. **声明式事务模型**:这是更推荐的方式,事务管理与业务逻辑分离,使得...

    全面分析_Spring_的编程式事务管理及声明式事务管理

    1. 隔离级别:如上所述,事务隔离级别是确保并发事务之间数据一致性的重要手段。Spring 提供了五种隔离级别,分别是 `ISOLATION_DEFAULT`、`ISOLATION_READ_UNCOMMITTED`、`ISOLATION_READ_COMMITTED`、`ISOLATION_...

    spring+mybatis的声明式事务

    Spring支持四种事务隔离级别:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE,每种级别对应不同的并发控制策略,开发者可以根据应用需求选择合适的隔离级别。 8. **回滚规则** 默认情况下,...

    Spring 事务开发代码文件

    - `isolation`: 事务隔离级别,如`Isolation.DEFAULT`(数据库默认),`Isolation.READ_UNCOMMITTED`等。 - `rollbackFor`:指定哪些异常类型发生时需要回滚事务。 - `noRollbackFor`:指定哪些异常类型发生时不...

    JAVA(Spring)事务管理.doc

    隔离级别是防止并发事务之间数据冲突的重要手段,常见的隔离级别有READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。每种隔离级别对应不同的并发控制策略,以防止脏读、不可重复读和幻读等问题。...

    A类B类C类嵌套事务问题相关类

    1. **事务隔离级别**:事务之间需要设定适当的隔离级别,如读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE),以防止并发问题,如脏读、不可重复读...

    springMVC+MYBATIS事务管理

    在SpringMVC+MyBatis的应用中,通常会在Service层方法上添加@Transactional注解,指定事务属性如隔离级别、传播行为等。当方法执行过程中出现异常时,Spring会自动回滚事务;若无异常,事务将在方法结束时提交。 4....

Global site tag (gtag.js) - Google Analytics