1.事务
1.1.事务概述与特征
事务是一条或多条组成的执行单元,该执行单元要么全部成功,要么全部失败。
例如银行转账,张三给李四转了200块,如果转账成功,张三减少200,李四增加200;如果转账失败,两边余额不变。
事务的特征(简称ACID):
- 原子性(Atomicity):一个事务中的操作,要么都完成,要么都失败;
- 一致性(Consistency):数据库的完整性不能破坏;
- 隔离性(Isolation):数据库允许多个事务并发执行,隔离性可以方式事务间的交叉执行导致数据不一致。
- 持久性(Durability):事务一旦完成,对数据的操作是永久性的。
1.2.事务的并发执行可能会引起的问题
- 脏读(dirty read):A事务读到B事务未提交的更改数据,B回滚事务后,A获取的数据不可靠;
- 不可重复读(unrepeatable read):A事务读取到B事务已提交的更新数据,A事务中第一次读到初始数据和读取到的B事务已提交的数据不一致;
- 虚读(phantom read):A事务读取到B事务已提交的新增数据;
- 第一类丢失更新:A事务回滚中将B事务已提交数据覆盖;
- 第二类丢失更新:A事务提交数据覆盖B事务已提交数据,造成B事务操作丢失。
1.3.事务隔离级别
- 读未提交(READ UNCOMMITED)
- 读已提交(READ COMMITED):可解决脏读;
- 可重复读(REPEATABLE READ):可解决脏读和不可重复读;
- 串行化(SERIALIZABLE)
2.TCL
# 关闭/开始事务自动提交
SET autocommit = 0/1(或OFF/ON);
# 事务提交
COMMIT;
# 创建标记点(保存点)
SAVEPOINT 标记点名
# 删除标记点
RELEASE SAVEPOINT 标记点名
# 事务回滚
ROLLBACK [TO 标记点名];
# 查询事务隔离级别
SELECT @@tx_isolation;
# 设置事务隔离级别
SET TRANSACTION 隔离级别
在MySQL中支持事务的存储引擎只有InnoDB。