本文共 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)脏读(Dirty Read)
脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的。
(2)不可重复读(Unrepeatable Read)
不可重复读意味着,在数据库访问中,同一个事务范围内,两个相同的查询却返回了不同的数据。这是由于查询时系统中其他事务提交数据而引起的。
(3)幻读(Phantom Read)
幻读,是指当事务并发执行时发生的一种现象。
例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会出现,操作第一个事务的用户发现表中存在没有被修改的数据行,就好像发生了幻觉一样。
事务的隔离级别
事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
√: 可能出现 ×: 不会出现
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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!