[toc]
## 一、事务定义
一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
## 二、事务的基本要素(ACID)
1.原子性(Atomicity):一个事务不可再分割,要么都执行要么都不执行
2.一致性(Consistency):一个事务执行会使数据从一个一致性状态切换到另外一个一致性状态
3.隔离性(Isolation):一个事物的执行不受其他事务的干扰
4.持久性(Durability):一个事务一旦提交,则会永久的改变数据库的数据
## 三、事务的创建
1.隐式事务:事务没有明显的开启和结束标记
例如:insert、update、delete语句
2.显示事务:事务具有明显的开启和结束的标记
<b>开启事务:set autocommit=0;
结束事务:commit;(提交事务) rollback;(回滚事务)</b>
在开始事务和结束事务中间填写要执行的增、删、改、查的操作(DML)。
## 四、事务的隔离级别
![](https://img.kancloud.cn/ff/42/ff4277844dca67ab8355fc5945aa667b_691x245.png)
1.read uncommitted(读未提交)
最低的隔离级别,一个事务可以读取另一个事务未提交的更新结果。
2.read committed(读提交)
大部分数据库采用的默认隔离级别,一个事务的更新操作结果只在该事务提交之后,另一个事务才可以读取到同一笔数据更新后的结果。
3.repeatable read(重复读)
<b>mysql的默认级别</b>。整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否在对共享数据进行更新,也不管跟新提交与否。
4.seriallizable(序列化)
最高隔离级别。所有事务操作一次顺序执行。注意这会导致并发度下降,性能最差。通常会用其他并发级别加上相应的锁的机制来取代它。
## 五、不同事务级别带来的并发问题
### 1.脏读
![](https://img.kancloud.cn/13/d6/13d6f5a5f6512d6d8f1f7dcdac9cdd0a_417x216.png)
脏读发生在一个事务A读取了另一个事务B修改,但还是未提交的数据。如果加入B回退,则事务A读取的就是无效数据。
### 2.不可重复读
![](https://img.kancloud.cn/a8/90/a8903c2b0ce76afe6e0be5486f7c9640_372x336.png)
在上面这个例子中,事务2提交成功,它所做的修改已经可见。然而,事务1已经读取了一个其它的值。在序列化和可重复读的隔离级别中,数据库管理系统会返回旧值,即在被事务2修改之前的值。在提交读和未提交读隔离级别下,可能会返回被更新的值,这就是“不可重复读”。
有两个策略可以防止这个问题的发生:
(1) 推迟事务2的执行,直至事务1提交或者回退。这种策略在使用锁时应用。
(2) 而在多版本并行控制中,事务2可以被先提交。而事务1,继续执行在旧版本的数据上。当事务1终于尝试提交时,数据库会检验它的结果是否和事务1、事务2顺序执行时一样。如果是,则事务1提交成功。如果不是,事务1会被回退。
### 3.幻读
![](https://img.kancloud.cn/49/a6/49a6d6346b35ea91515e875a346bffec_250x477.png)
幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。
发生的情况:没有范围锁。