事务的四大特性(ACID)
Mysql的默认引擎innoDb支持事务
-
原子性(Atomicity)
① 事务是一个不可分割的最小工作单位,即事务的各元素是不可分的,事务中的所有元素必须作为一个整体提交或回滚;
② 以事务为单位的操作执行结果都只有“成功”和“失败”两种情况; -
一致性(Consistency)
事务的一致性是指:事务必须使数据库从一个一致性状态变换到另一个一致性状态:
① 事务开始之前和事务结束以后,数据库的完整性约束没有被破坏;
② 事务开始前和事务完成时,数据必须处于一致状态;(正在执行中的事务中,数据可能不一致) -
隔离性(Isolation)
① 在并发环境中,当不同的事务操纵相同的数据时,每个事务都有各自完整且独立的数据空间,所以并发事务之间不会互相干扰;
② 对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖或影响其他事务。 -
持久性(Durability)
事务处理的结果都是永久的,一旦事务被提交,事务对数据库所作的更改会永久地保存在数据库中,不会被回滚。
在事务管理中,原子性是基础、隔离性是手段,一致性是目的,持久性是结果。
事务的使用方法
- 开启事务
BEGIN
- 提交事务
COMMIT
- 回滚事务( 回滚整个事务或回滚到保留点 )
ROLLBACK [TO 保留点名]
- 设置保留点
SAVEPOINT [保留点名]
事务的隔离级别
-- 查看事务的隔离级别:
SELECT @@TRANSACTION_ISOLATION
-- 设置事务隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITED | READ COMMITED | REPEATABLE READ | SERIALIZABLE}
并发事务造成的三大问题
-
脏读
操作步骤:
①事务A修改id为1的字段数据,事务还未提交;
②事务A修改后但未提交的数据被事务B读取。
现象:
并发场景下,事务读取了其他并发事务修改但未提交的数据。
此时被事务B读取过去的数据称为“脏数据”。出现的并发问题称为“脏读”
-
不可重复读
前提:提升了事务的隔离级别,解决了“脏读”问题后出现的新问题。
操作步骤:
①事务A读取id为1的字段的数据;
②事务B提交了事务,修改了id为1的字段的数据;
③事务A再次读取id为1的字段的数据时,读到了B事务提交后的数据。
现象:事务A两次读取相同数据,由于受并发事务影响,读到的值都不同。
-
幻读
前提:提升了事务的隔离级别,解决了“不可重复读”问题后出现的新问题。
操作步骤:
①事务A查询id为1的字段,数据库返回信息:没有id为1的数据;
②事务B提交了事务,插入了一条id为1的数据;
③事务A插入一条id为1的数据报错,数据库提示已经存在该数据;
④事务A再次查询id为1的字段,数据库返回信息:依旧没有id为1的数据。
现象:由于解决了“不可重复读”问题,事务间无法读取其他事务提交的数据,而在进行数据操作的时候可能又会由于其他事务提交的数据而受到限制。就像是出现“幻觉”了一样,明明没有数据,但是插入数据的时候又提示已经存在数据
图片来源于互联网,笔记仅供学习使用,如若文中描述错误,敬请指导。