MySQL 事务系列 1
Last updated: Oct 219, 21029
问
数据库中的事务是什么?事务的几大特性?不同的隔离级别?
答
概念
事务指的是一组原子性的 SQL 操作,或者一个独立的 工作单元。
数据库引擎执行事务会有以下特点:
- 如果成功地执行该组的所有语句,就执行该组查询
- 如果有任何一条语句崩溃或其他原因无法执行,则不会执行该组查询
- 不允许部分语句执行成功
举例
银行应用,数据库有两张表:支票表(checking) 和 储蓄表(saving)
执行转账操作:从用户 Jane 的支票账户转移 200 到其储蓄账户
在 MySQL 中,该事务语句如下:
START TRANSACTION;
SELECT balance FROM checking WHERE name = 'Jane';
UPDATE checking SET balance = balance - 200.00 WHERE name = 'Jane';
UPDATE saving SET balance = balance + 200.00 WHERE name = 'Jane';
COMMIT;
四大特性
原子性
Atomicity,一个事务必须被视为一个 不可分割 的 最小 工作单元
一致性
Consistency,数据库总是从一个 一致性 的状态转换到另一个 一致性 的状态
隔离性
Isolation,各事务内部所做的修改对其他事务的可见性,具体见隔离级别
持久性
Durability,一旦事务提交了,其所做的修改就会永久保存在数据库中
因:实现了 ACID 的数据库,相比没实现的数据库,需要消耗更多的 CPU 能力
果:针对实际情况,选择合适的存储引擎
隔离级别
因:当存在多个事务同时操作时,可能出现以下问题:
- 脏读 (dirty read)
- 不可重复读 (non-repeatable read)
- 幻读 (phantom read)
果:为了解决这些问题,就引出了 “隔离级别” 的概念
SQL 标准中定义了四种隔离级别,分别是:
- 未提交读
- 提交读
- 可重复读
- 可串行化
未提交读
即 READ UNCOMMITED
指 一个事务还没有提交时,它做的变更就能被其他事务看到
提交读
即 READ COMMITED
指 一个事务提交之后,它做的变更才能被其他事务看到
也称为 不可重复读 (nonrepeatable read)
大多数的 RDBMS 的默认隔离级别是 提交读
可重复读
即 REPEATABLE READ
指 一个事务在执行过程中看到的数据,总是跟该事务在启动时看到的数据是一致的
是 MySQL 的默认隔离级别
串行化
即 SERIALIZABLE
指 对同一行记录,“写“操作加“写锁”,“读”操作加“读锁”。
当出现读写锁冲突时,后访问的事务必须等待前一个事务执行完成,串行执行