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 |
提交事务 |
|
本文详细介绍了数据库事务在并发操作中可能遇到的各种问题,包括丢失更新、脏读、不可重复读和幻读等,并通过具体的时间线示例展示了这些问题的发生过程。
846

被折叠的 条评论
为什么被折叠?



