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不支持事务回滚
只有把命运掌握在自己手中,从今天起开始努力,即使暂时看不到希望,也要相信自己。因为比你牛几倍的人,依然在努力。
原文地址:https://www.cnblogs.com/freesky168/p/14358247.html