数据库事务及四种隔离级别

最近搭建自动化测试平台需要用到mysql进行数据存储,再加上之前面试有遇到这个问题,于是在此加以记录和学习。

一、事务的概念
事务(Transaction),是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

二、事务的属性:
事务有四个属性,简称ACDI:
1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割
的,要么全部完成,要么全部不执行。
2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。
3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

三、事务的并发操作问题
在事务的并发操作中可能会出现脏读,不可重复读,幻读等现象。
脏读:指当一个事务正在访问数据,并且对数据进行了修改,而这种数据还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据还没有提交那么另外一个事务读取到的这个数据我们称之为脏数据。依据脏数据所做的操作肯能是不正确的。
幻读:幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
不可重复读:A事务中第一次和第二次读取到的数据不一致,在A事务两次读取数据之间,B事务对数据进行了修改并且提交了,然后A事务第二次读取到的数据就是B事务修改之后的数据,导致A事务第一次和第二次读取到的数据不一致,这就叫做不可重复读。
不可重复读的重点是修改,幻读的重点在于新增或者删除。

四、数据库的隔离级别
1.READ UNCIMMITTED(未提交读)
另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)。
该级别允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
2.提交读(READ COMMITTED)
本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)。
该级别只能读取到已经提交的数据。mysql等很多数据库的默认隔离级别都谁提交读。
3、可重复读(REPEATABLE READ)
在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象(稍后解释)。
该级别在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读;
4、串行化(SERIALIZABLE)
读操作会隐式获取共享锁,可以保证不同事务间的互斥。
该级别是完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞;

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页