一,什么是事务

Transaction事务:一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)
一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成
事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。
处理是将多个操作或者命令一起执行,所有命令全部成功执行才意味着该事务的成功,任何一个命令失败都意味着该事务的失败。

| 以银行转账为例(100块都不给),
A要给B 转账100元,
A转账的指令已经成功发出,而B 由于未知的原因接收失败,
如果两个命令单独执行,那么A账户少了100块,但是B又没收到100块,显而易见是不合理的;
如果将A向B 转账100元当成一个事务处理,那么由于B 接收的失败,整个转账事务都将失败,A不会少100,B更不会增加100,这个时候“100块都不给”才是合理的情况。 | | —- |

二,事务的特征

|   一般来说,事务是必须满足 4 个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
 ♞ 原子性:将所有 SQL 作为原子工作单元执行,要么全部执行,要么全部不执行
 ♞ 一致性:事务完成后,所有数据的状态都是一致的
 ♞ 隔离性:如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离
 ♞ 持久性:即事务完成后,对数据库数据的修改被持久化存储 | | —- |

三,事务的执行流程

1,事务的控制

在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT = 0,用来禁止使用当前会话的自动提交。
image.png

2. 事务控制语句

  1.  BEGIN 或 START TRANSACTION 显式地开启一个事务;
  2.  COMMIT 或 COMMIT WORK 提交事务,并使已对数据库进行的所有修改成为永久性的;
  3.  ROLLBACK 或 ROLLBACK WORK 回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
  4.  SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
  5.  RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
  6.  ROLLBACK TO identifier 把事务回滚到标记点;
  7.  SET TRANSACTION 用来设置事务的隔离级别。
查看存储引擎 SHOW CREATE TABLE 表名;
更改引擎 ALTER TABLE 表名 ENGINE=新引擎名;
回滚 ROLLBACK;
声明事务开始 BEIGIN;
事务提交 COMMIT;
查询自动提交功能状态 SELECT @@AUTOCOMMIT;
设置自动提交功能 SET AUTOCOMMIT=0或1;
设置分离水平 SET SESSION TRANSACTION ISOLATION LEVEL 分离水平;

3,事务的处理 ☞ 用 BEGIN, ROLLBACK, COMMIT 来实现

  1. begin # 开始一个事务
  2. // TODO···
  3. rollback # 事务回滚
  4. commit # 事务提交

直接用 SET 来改变 MySQL 的自动提交模式:

  1. # 查看事务提交哦方式
  2. select @@autocommit;
  3. # 禁止自动提交
  4. set autocommit = 0;
  5. # 开启自动提交
  6. set autocommit = 1;

☞ 注意
  使用 set autocommit = 0 的时候,之后所有的 SQL 都将做为事务处理,直到使用 commit 确认或 rollback 回滚结束,注意当结束这个事务的同时也开启了个新的事务!用 BEGIN, ROLLBACK, COMMIT 来实现只将当前的作为一个事务!

四,事务的隔离级别

| 对于两个并发执行的事务,如果涉及到操作同一条记录的时候,可能会发生问题。因为并发操作会带来数据的不一致性,包括脏读(读到了其他事务没有提交的数据)、不可重复读(同一个事务中,读到了另一个事务 update 的数据)、幻读(同一个事务中,读到了另一个事务 insert 的数据)等。不可重复读和幻读很类似,但是不可重复读针对的是值的不同,幻读指的是数据条数的不同。数据库系统提供了隔离级别来让我们有针对性地选择事务的隔离级别,避免数据不一致的问题。SQL 标准定义了 4 种隔离级别,分别对应可能出现的数据不一致的情况。 | | —- |

隔离级别 脏读(Dirty Read) 不可重复读(Non Repeatable Read) 幻读(Phantom Read) 备注
read uncommitted (读未提交)
read committed
(读已提交)
- Oracle 默认
repeatable read
(可重复读)
- - MySQL 默认
serializable(串行化) - - - 可以解决所有问题
但是效率极低

详解 事务隔离性详解

1,☞ 隔离级别相关操作

  1. # 查看事务隔离级别
  2. mysql> select @@tx_isolation;
  3. +-----------------+
  4. | @@tx_isolation |
  5. +-----------------+
  6. | REPEATABLE-READ |
  7. +-----------------+
  8. 1 row in set (0.06 sec)
  9. # 设置事务隔离级别,read uncommitted 读未提交
  10. mysql> set global transaction isolation level read uncommitted;
  11. Query OK, 0 rows affected (0.05 sec)