----------------------------------------------JDBC事务的隔离级别----------------------------------------------------
事务隔离级别
l 隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
(准确的说隔离级别是可以设置的,可以设置为事物之间相互干扰,也可以设置为事务之间不会相互干扰,主要体现在两个事务一个在写数据,一个在读数据,对读的一方是有影响的)
Ø 事务的并发读问题
l 脏读:读取到另一个事务未提交数据;
l 不可重复读:两次读取不一致;
l 幻读(虚读):读到另一事务已提交数据。
Ø 2 五大并发事务问题
因为并发事务导致的问题大致有5类,其中两类是更新问题,三类是读问题。
l 脏读(dirty read):读到未提交更新数据
时间 |
转账事务A |
取款事务B |
T1 |
|
开始事务 |
T2 |
开始事务 |
|
T3 |
|
查询账户余额为1000元 |
T4 |
|
取出500元把余额改为500元 |
T5 |
查看账户余额为500元(脏读) |
|
T6 |
|
撤销事务,余额恢复为1000元 |
T7 |
汇入100元把余额改为600元 |
|
T8 |
提交事务 |
|
A事务查询到了B事务未提交的更新数据,A事务依据这个查询结果继续执行相关操作。但是接着B事务撤销了所做的更新,这会导致A事务操作的是脏数据。(这是绝对不允许出现的事情)
l 虚读(幻读)(phantom read):读到已提交插入数据
时间 |
统计金额事务A |
转账事务B |
T1 |
|
开始事务 |
T2 |
开始事务 |
|
T3 |
统计总存款数为10000元 |
|
T4 |
|
新增一个存款账户,存款为100元 |
T5 |
|
提交事务 |
T6 |
再次统计总存款数为10100元 |
|
A事务第一次查询时,没有问题,第二次查询时查到了B事务已提交的新插入数据,这导致两次查询结果不同。(在实际开发中,很少会对相同数据进行两次查询,所以可以考虑是否允许虚读)
l 不可重复读(unrepeatable read):读到已提交更新数据
时间 |
取款事务A |
转账事务B |
T1 |
|
开始事务 |
T2 |
开始事务 |
|
T3 |
|
查询账户余额为1000元 |
T4 |
查询账户余额为1000元 |
|
T5 |
|
取出100元,把余额改为900元 |