一、事务的概念
事务:一组操作逻辑,使数据从一个状态转变到另一个状态。
事务特性:
- 原子性(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