文章分享-9周-Oracle的事务隔离级别

参考资料 官方文档

数据库方向定义几种隔离级别
Dirty Read(脏读)、Nonrepeatable Read(不可重复读)、Phantom Read(幻读)


文章分享-9周-Oracle的事务隔离级别_第1张图片
image.png

脏读:发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。
不可重复读:事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了。
幻读:事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了。

不可重复读和幻读的区别是:前者是指读到了已经提交的事务的更改数据(修改或删除),后者是指读到了其他已经提交事务的新增数据。

Oracle 提供三种事务隔离级别,下面通过实现证明具体效果

Read Committed Isolation Level

Oracle默认为这种隔离级别。避免脏读
事务A,查询数据


文章分享-9周-Oracle的事务隔离级别_第2张图片
image.png

事务B,查询数据


文章分享-9周-Oracle的事务隔离级别_第3张图片
image.png

事务A,修改数据,查询数据已修改


文章分享-9周-Oracle的事务隔离级别_第4张图片
image.png

事务B,查询数据,数据没有修改


文章分享-9周-Oracle的事务隔离级别_第5张图片
image.png

事务A,提交事务


image.png

事务B,查询数据,数据已修改


文章分享-9周-Oracle的事务隔离级别_第6张图片
image.png

结果事务B只能读到事务A提交的事务,无提交或回滚的事务无法读取。

Serializable Isolation Level

避免不可重复读
事务A,查询数据


文章分享-9周-Oracle的事务隔离级别_第7张图片
image.png

事务B,修改数据并提交事务


文章分享-9周-Oracle的事务隔离级别_第8张图片
image.png

事务A,查询数据,但是发现数据没有改变


文章分享-9周-Oracle的事务隔离级别_第9张图片
image.png

事务A,当前事务提交之后,再次查询则数据发生变化


文章分享-9周-Oracle的事务隔离级别_第10张图片
image.png

Read-Only Isolation Level

只读事务只能看到事务执行前就已经提交的数据,且事务中不能执行 INSERT , UPDATE ,及 DELETE 语句。(目前设置不了这种事务隔离级别)

不可重复读和幻读的区别

不可重复读重点在于update和delete(避免不可重复读需要锁行就行)
幻读的重点在于insert(避免幻读也解决不可重复读的问题)(避免幻影读则需要锁表)

你可能感兴趣的:(文章分享-9周-Oracle的事务隔离级别)