1.事务的特性:
acid:atomic原子性不用多说 consistent一致性就是系统的数据不会遭到破坏 isolated隔离性防止同时读取同一条记录 durable持久性保存在db或其它形式的持久设备中
隔离级别的几个重要概念
脏读:事务 A 事务B A对一条记录修改但未提交,B此时读取此条记录,之后Acommit失败
不可重复读:事务 A 事务B A里面执行两次或以上的查询,查询的结果不对,在中间B对此记录改变了
幻读:当读取几条记录后,另外一个事务插入了一条记录,此后的查询会出现原来没有的额外记录
为防止以上的情况,可以采用不同的隔离级别
2.事务并发时可能出现的问题:
1.第一类丢失更新(Lost Update)
时间 | 事务A | 事务B |
T1 | 开始事务 |
|
T2 |
| 开始事务 |
T3 | 查询账户余额1000 |
|
T4 |
| 查询账户余额1000 |
T5 |
| 汇入100元把余额更新1100 |
T6 |
| 提交事务 |
T7 | 取出100把余额改成900 |
|
T8 | 撤销更新 |
|
T9 | 余额为1000(丢失更新) |
|
2.脏读(dirty read)读了一个没有提交的事务的数据
时间 | 事务A | 事务B |
T1 | 开始事务 |
|
T2 |
| 开始事务 |
T3 |
| 查询账户余额1000 |
T4 |
| 汇入100元把余额更新1100 |
T5 | 查询账户余额1000(脏读) |
|
T6 |
| 回滚 |
T7 | 取款1100 |
|
T8 | 提交事务失败 |
|
3.不可重复读(non-repeatable read),同一个事务前后数据不一致,被其它事务所影响
时间 | 事务A | 事务B |
T1 | 开始事务 |
|
T2 |
| 开始事务 |
T3 | 查询账户余额1000 |
|
T4 |
| 汇入100元把余额更新1100 |
T5 |
| 提交事务 |
T6 | 查询账户余额1100 |
|
T7 | 取款1100 |
|
T8 | 提交事务 |
|
4.第二类丢失更新(second lost update proplem)
时间 | 转账事务A | 取款事务B |
T1 |
| 开始事务 |
T2 | 开始事务 |
|
T3 |
| 查询账户余额1000 |
T4 | 查询账户余额1000 |
|
T5 |
| 取出100元把余额更新900 |
T6 |
| 提交事务 |
T7 | 存入100 |
|
T8 | 提交事务 |
|
T9 | 把余额为1100(丢失更新) |
|
5.幻读(phantom read),插入和更新
时间 | 查询事务A | 插入事务B |
T1 | 开始事务 |
|
T2 |
| 开始事务 |
T3 | 查询学生人数为10 |
|
T4 |
| 插入一个新学生 |
T5 |
|
|
T6 | 查询学生人数为11 | 提交事务 |
T7 |
|
|
T8 | 提交事务 |
|