一、事务的概念
事务:一组操作逻辑,使数据从一个状态转变到另一个状态。
事务特性:
- 原子性(atomicity):
一个不可分割的工作单元,要么全部提交,要么全部回滚。 - 一致性(consistency):
事务执行前后,数据从一个合法状态转变到另一个合法状态 - 隔离性(isolation):
事务之间相互不干扰。 - 持久性(durablility)
事务被提交,则对数据修改时永久性的。
事务状态:
- 活动(active):事务正在执行中
- 部分提交(partially committed):数据已提交到内存,未修改到磁盘
- 失败(failed):活动和部分提交的中的事务,出现异常,导致无法继续执行。
- 中止(aborted):失败的事务回滚执行完成后。
- 提交(committed)
二、基本操作
1、显示事务
开启事务:start transaction或者begin
保存点:savepoint [name];
回滚:rollback
提交:commit
2、隐式事务
MySQL变量autocommit默认设置为ON,设置为false即可关闭自动DML事务提交。
##查询变量
show variables like "autocommit";
## 关闭自动提交
set autocommit=false;
## 开启自动提交
set autocommit=ture;
- DDL自动提交。
- 针对用户的操作会自动提交。
- 两个事务间无
commit或rollback则前一个事务会自动提交。 start slave、stop slave、reset slave、change master to这些关于MySQL主从复制的语句会隐式提交。analiyze table、cache index、check table、flush、load index into cache、optimize table、repair table、reset等也会隐式提交。
三、事务隔离级别
1、问题背景
在事务并发时,常出现一些问题:
- **脏写:**事务A、B同时开启,在未终止或未提交前,事务A修改了事务B中修改的数据。
- **脏读:**事务A、B同时开启,事务A读取了事务B更新而未提交的数据,事务B最终回滚了数据,则A读取的数据是脏数据。
- **不可重复读:**事务A、B同时开启,在事务A两次读取同一字段之间,事务B修改了该字段,导致事务A两次读取字段结果不同。
- **幻读:**事务A、B同时开启,在事务A两次读取同一字段之间,事务B插入一些行,导致事务A两次读取字段结果增加。
一般认为问题严重程度排序如下:
脏写 > 脏读 > 不可重复读 > 幻读
2、SQL事务隔离级别
READ UNCOMMITTED: 读未提交。READ COMMITTED: 读已提交。REPEATABLE READ: 可重复读。SERIALIZABLE: 可串行。
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
|---|---|---|---|---|
| READ UNCOMMITTED | Yes | Yes | Yes | No |
| READ COMMIITTED | No | Yes | Yes | No |
| REPEATABLE READ | No | No | Yes | No |
| SERIALIZABLE | No | No | No | Yes |
3、查看和修改MySQL中的事务隔离级别
MySQL默认事务隔离为REPEATABLE-READ.
## 查看事务隔离级别
show @@transection;
## 设置事务隔离级别
set [global|session] transection_istoloation='READ-UNCOMMITTED | READ-COMMIITTED | REPEATABLE-READ | SERIALIZABLE';
## 在my.cnf写入,写在[mysqld]下
transaction-isolation = READ-COMMITTED










