本地事务ACID特性

xiaoxiao2021-02-27  223

本地事务的概念        

          所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

         我们站在系统架构的角度,说一说什么是本地事务?

         本地事务:基于单个服务单一数据库资源访问的事务,被称为本地事务(Local Transaction)

       

          例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。

      数据库事务必须具备ACID特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。

数据库事务的ACID特性

      原子性(Atomicity):一个事务的所有操作,要么全部完成,要么全部不完成。指整个数据库事务是不可分割的工作单位。

        只有使据库中所有的操作执行成功,才算整个事务成功;事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行事务前的状态。

      一致性(Consistency):指事务开始之前和事务结束之后,数据的完整性约束没有被破坏。

        包含两层含义:

        a)数据库机制层面,事务执行前后,数据能符合设置的约束,如唯一约束、外键约束;

        b)业务层面,由应用开发人员保证业务数据一致性。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中Tom和Jack的存款总额为2000元。

      也有说法一致性包含另外一层语义:事务的中间状态不应该被观察到。我看到有人说这个语义属于原子性,也看到有的划分到了隔离性。

      隔离性(Isolation):指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。如同只有这一个操作在被数据库所执行一样

      持久性(Durability):指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。

   事务的ACID特性是由关系数据库管理系统(RDBMS,数据库系统)来实现的。

数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。数据库管理系统采用锁机制来实现事务的隔离性。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。

事务之间的相互影响

事务之间的相互影响分为以下几种情况:

(1)脏读(Dirty Read)

        脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的。

 

(2)不可重复读(Unrepeatable Read)

        不可重复读意味着,在数据库访问中,同一个事务范围内,两个相同的查询却返回了不同的数据。这是由于查询时系统中其他事务提交数据而引起的。

 

(3)幻读(Phantom Read)

        幻读,是指当事务并发执行时发生的一种现象。

        例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会出现,操作第一个事务的用户发现表中存在没有被修改的数据行,就好像发生了幻觉一样。

 

数据库事务的隔离级别

         数据库事务的隔离级别有4个,由低到高依次为Read uncommittedRead committedRepeatable readSerializable,这四个级别可以逐个解决脏读不可重复读幻读这几类问题。

 

√: 可能出现    ×: 不会出现

DB和spring隔离级别的对应关系 DB事务隔离级别脏读不可重复读幻读

对应Spring隔离级别

(ISOLATION_DEFAULT:使用后端数据库默认的隔离级别)

Read uncommitted√√√ISOLATION_READ_UNCOMMITTEDRead committed×√√ISOLATION_READ_COMMITTEDRepeatable read××√ISOLATION_REPEATABLE_READSerializable×××ISOLATION_SERIALIZABLE

注意:MySQL的默认隔离级别就是Repeatable read。

 

 

Jeff.Star 认证博客专家 Java [努力支撑经历,经历支撑能力.][思路决定出路,细节决定成败.][聚焦,分享,转化,参与.][数据在流动,技术在流动,我们也要流动.]微信:TiensC
转载请注明原文地址: https://www.6miu.com/read-11282.html

最新回复(0)