Spring Transaction详解 - Transaction Isolation

Transaction Isolation

参考文档:

  1. Ask Tom: On Transaction Isolation Levels

  2. wiki isolation level

  3. JDBC transaction

相关代码:github

数据库并发访问读取时的现象

先来了解一下当数据库并发读取时会出现的现象,因为所谓的事务隔离级别是针对这些现象而提出的:

  1. Dirty read(wiki):A事务在读取某一行数据的时候,能够读到B事务还未提交的、对同一行数据的修改。

  2. Nonrepeatable read:(wiki):在同一个事务里,在T1时间读取到的某一行的数据,在T2时间再次读取同一行数据时,发生了变化。后者变化可能是被更新了、消失了。

  3. Phantom read(wiki):在同一个事务里,用条件A,在T1时间查询到的数据是10行,但是在T2时间查询到的数据多于10行。需要注意的是,和 Nonrepeatable read 不同,Phantom read 在T1时读到的数据在T2时不会发生变化。注意,为何只说比10行多,那么比10行少就不是 Phantom read 了吗?因为 Nonrepeatable read 包含了数据消失的情况。

事务隔离级别

Isolation LevelDirty ReadNonrepeatable ReadPhantom Read
READ UNCOMMITTEDPermittedPermittePermitted
READ COMMITTED--PermittedPermitted
REPEATABLE READ----Permitted
SERIALIZABLE------

例子

事务隔离级别因数据库的不同实现而有所区别(见Ask Tom: On Transaction Isolation Levels),因此这里只提供Oracle相关的测试代码。顺便一提,因为Oracle只支持READ COMMITTED和SERIALIZABLE两种隔离级别因此只针对这两个做了测试。具体情况就不多说了,自己看吧。

如果要启动测试代码,你需要有一个oracle数据库,然后修改 src/test/resources/application-isolation.properties 文件,修改里面的配置文件,然后再运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值