事务概述
什么是数据库事务
是一条或一组sql语句组成的执行单元,这个执行单元里的sql语句要么全部执行成功,要么全部执行失败。
事务ACID特性
- 原子性(Atomicity)
事务的所有操作是不可分割的,要么全部完成,要么全部不完成,不能停在中间的某个操作上。 - 一致性(Consistency)
一个事务执行前后数据的完整性要保持一致。以转账为例:
转账前:张三账户500元,李四账户500元,二者总金额1000元;
转账操作:张三转给李四100元;
转账后:张三400元,李四600元,二者总金额还是1000元。
- 隔离性(Isolation)
一个事务执行操作的数据不能其它事务的影响,针对的是指并发事务之间。 - 持久性(Durability)
事务一旦完成,对数据的更改是永久性的,不会受数据库故障影响。
事务并发可能引起的问题
- 脏读
事务T1读取了事务T2更新还未提交的数据,若T2回滚事务,则T1读取的数据是临时且无效的。 - 不可重复读
事务T1读取了一个字段,之后事务T2更新了该字段,当事务T1再次读取该字段时,看到的数据前后不一样。 - 幻读
事务T1读取一个字段后,事务T2在该字段的所在表插入一些行后,当事务T1再次读取时多出了一些行。
事务的隔离级别
一个事务与其它事务隔离的程度称为隔离程度。不同的隔离级别可解决不同的事务并发问题。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED | √ | √ | √ |
READ COMMITTED | √ | √ | |
REPEATABLE READ | √ | ||
SERIALIZABLE |
注:√表示在此事务隔离级别下事务并发仍会出现的问题。
MySQL默认的隔离级别是REPEATABLE READ
MySQL对于以上4种隔离级别都支持
MySQL TCL语法
使用事务的SQL模板:
SET autocommit = 0; /*关闭自动提交功能*/
[START TRANSACTION;]
[DML 语句]
COMMIT | ROLLBACK [TO <保存点>];
设置事务隔离级别
SET session|global transaction isolation level <隔离级别名>;
查看当前隔离级别
SELECT @@tx_isolation;