本地事务ACID特性
发布日期:2021-06-30 13:44:11 浏览次数:2 分类:技术文章

本文共 1879 字,大约阅读时间需要 6 分钟。

本地事务的概念        

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

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

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

       

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

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

数据库事务的ACID特性

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

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

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

        包含两层含义:

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

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

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

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

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

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

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

事务之间的相互影响

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

(1)脏读(Dirty Read)

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

 

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

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

 

(3)幻读(Phantom Read)

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

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

 

事务的隔离级别

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

 

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

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

对应Spring隔离级别

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

Read uncommitted ISOLATION_READ_UNCOMMITTED
Read committed × ISOLATION_READ_COMMITTED
Repeatable read × × ISOLATION_REPEATABLE_READ
Serializable × × × ISOLATION_SERIALIZABLE

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

 

 

转载地址:https://jeffsheng.blog.csdn.net/article/details/76696547 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:分布式锁实现的基本分析
下一篇:CAS算法实现数据更新的简单理解和ABA问题

发表评论

最新留言

不错!
[***.144.177.141]2024年04月17日 00时35分00秒