MySQL之事务控制总结
MySQL支持TCL(Transaction Control Language)。事务是指一条或者多条组成的SQL语句,要么全部执行要么全部不执行。
- 事务的四大特性(ACDI):
(1)原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,要么都执行要么都不执行。
(2)一致性(consistency):一个事务执行会使数据从一个一致状态切换到另外一个一致状态。也就是说数据
库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束例如:小明和小华账户余额均为5,
无论他们之间怎么转账,他们余额之和始终为10块。
(3)永久性(durability)事务一旦提交,对数据的改变是永久性的。
(4)隔离性(isolation):事务与事务之间互不干扰。
- MySQL执行事务过程
(1)开启事务:set autocommit=0; start transaction(可选);
(2)编写事务中的sql语句(只对select insert update delete语句有效):语句1...;语句2...;...
(3)结束事务:
提交事务--commit;
回滚事务--rollback;
回滚至节点--savepoint 节点名;下面代码表示节点1之后的代码不会生效
SET autocommit=0;
START TRANSACTION;
DELETE FROM 表1 WHERE 条件;
SAVEPOINT 节点1;#设置保存点
DELETE FROM 表1 WHERE 条件;
ROLLBACK TO 节点1;#回滚到保存点
- 数据并发问题:一个数据库可能拥有多个访问客户端,这些客户端可能用并发的方式访问数据库,如果没有必要的隔离措施就会导致各种并发问题,破坏数据完整性。通常有以下场景:
(1)脏读(Dirty Read):A事务读取到了B事务没有提交的数据,并在此基础进行操作。
(2)幻读(Phantom):A事务读取B事务新增数据,A事务发生幻象读。
(3)不可重复读(Nonrepeatable Read):A读取了B事务已经提交的更改数据,A事务两次读取同一数据,得到
内容不同。
(4)第一类丢失更新: A事务撤销时,把已提交的B事务的更新数据覆盖了。
(5)第二类丢失更新:A事务覆盖B事务已经提交的数据。
-
MySQL数据库提供的隔离级别:Read uncommitted (读未提交数据)、Read committed(读已提交数据) 、Repeatable read(可以重复读) 、Serializable(串行化,很安全,性能十分低下) 。
查看隔离级别:select @@tx_isolation;
设置隔离级别:set session|global transaction isolation level 隔离级别;
隔离级别 | 脏读 | 幻读 | 不可重复读 | 第一类丢失更新 | 第二类丢失更新 |
Read uncommitted | ✓ | ✓ | ✓ | × | ✓ |
Read committed | × | ✓ | ✓ | × | ✓ |
Repeatable read | × | ✓ | × | × | × |
Serializable | × | × | × | × | × |
- Delete支持事务回滚,Truncate不支持事务回滚
只有把命运掌握在自己手中,从今天起开始努力,即使暂时看不到希望,也要相信自己。因为比你牛几倍的人,依然在努力。