相关文章:
事务是指作为单个逻辑工作单元执行的一系列操作,要么全部执行,要么全部不执行
一、事务的四个特性 (ACID)
-
原子性 (Atomic)
- 事务包含的所有操作,要么全部执行,要么全部不执行
-
一致性 (Consistency)
-
事务应确保数据库的状态从一个一致状态转换到另一个一致状态
-
如:拿转账来说,假设用户 A 和用户 B,两者的钱加起来一共是 2000 元,那么不管 A 和 B 之间如何转账,转几次账,事务结束后,两个用户的钱相加起来应该还为 2000 元,这就是事务的一致性
-
-
隔离性 (Isolation)
- 多个事务并发执行时,一个事务的执行不会影响其他事务的执行,各个事务之间互不干扰
-
持久性 (Durability)
- 一个事务一旦被提交,其对数据库的修改就会永久保存在数据库中,即使数据库发生故障,也不会对数据产生任何影响
二、事务并发访问引起的问题
-
更新丢失
-
一个事务的更新覆盖了另一个事务的更新
-
MySQL 所有事务隔离级别在数据库层面上均可避免
-
-
脏读
- 当事务 A 正在访问某个数据,并对其进行了修改但并未提交,此时事务 B 也访问了该数据,但读取到的是事务 A 尚未提交的数据,此为脏读
-
不可重复读
-
当事务 A 多次读取某个数据期间,事务 B 也访问了该数据,并对其进行了修改并提交,那么由于事务 B 的修改会导致事务 A 前后两次读取到的数据内容不一致,此为不可重复读
-
侧重于对数据的修改
-
-
幻读
-
当事务 A 多次读取某个数据期间,事务 B 也访问了该数据,并对其进行了添加 / 删除并提交,那么由于事务 B 的添加 / 删除会导致事务 A 前后两次读取到的数据数量不一致,此为幻读
-
侧重于对数据的添加 / 修改
-
-
PS:不可重复读和幻读的区别
-
不可重复读
- 侧重于对数据的修改,如:多次读取某数据时,发现某些列的值被修改
-
幻读
- 侧重于对数据的添加 / 修改,如:多次读取某数据时,发现数据的数量增加或减少了
-
三、事务的四个隔离级别
-
读未提交 (Read Uncommitted)
-
最低的隔离级别,允许事务读取其他事务尚未提交的数据
-
可能会出现脏读、不可重复读、幻读
-
-
读提交 (Read Committed)
-
允许事务读取其他事务已经提交的数据
-
避免了脏读,但可能会出现不可重复读、幻读
-
是 Oracle 的默认隔离级别
-
-
可重复读 (Repeatable Read)
-
事务对于某个数据的多次读取结果都是一致的
-
避免了脏读、不可重复读,但可能会出现幻读
-
是 MySQL (InnoDB 存储引擎) 的默认隔离级别
-
-
串行化 (Serializable)
-
最高的隔离级别,完全遵循 ACID 的原则,所有事务依次执行,各个事务之间互不干扰
-
避免了脏读、不可重复读、幻读
-
-
PS:如何查看、设置事务的隔离级别
-
查看事务隔离级别
版本 SQL MySQL8.0 之前 select @@tx_isolation;
MySQL8.0 开始 SELECT @@transaction_isolation;
-
设置事务隔离级别
隔离级别 SQL 设置为读未提交 set session transaction isolation level read uncommitted;
设置为读提交 set session transaction isolation level read committed;
设置为可重复读 set session transaction isolation level repeatable read;
设置为串行化 set session transaction isolation level serializable;
-