首页 > 图灵资讯 > java面试题>正文

金三银四精选面试题-事务的隔离级别

2023-11-19 09:45:28

 

事务的隔离级别

读未提交(Read UnCommitted/RU)

又称为脏读,一个事务可以读取到另一个事务未提交的数据。这种隔离级别是最不安全的一种,因为未提交的事务是存在回滚的情况。

举个例子:我的工资是3000,这个月发工资,财务不小心按错了数字,还没有来得及提交事务,就在这个时候,我发现的工资变为了3500元,我以为涨工资了高兴的飞起 ,财务发现不对,回滚了事务,将工资改回了3000元再提交。

实际我这个月的工资还是3000,但是我看到的是3500。我看到的是财务还没提交事务时的数据。这就是脏读。

读已提交(Read Committed/RC)

又称为不可重复读,一个事务因为读取到另一个事务已提交的修改数据,导致在当前事务的不同时间读取同一条数据获取的结果不一致。

举个例子:某已婚男子欲购买一套新房准备迎接新生命的到来,购房款 330万 ,付款的时候查询自己账号余额 360万(第一次查询),就在这个时候,该已婚男子的爱人,购买了理财产品,价值50万,并提交事务;该已婚男使用POS机付房款的时候发现钱不够了(第二次查询需要等待爱人支出事务提交完成)

如果有事务对数据进行更新(UPDATE)操作时,读取数据事务要等待这个更新操作事务提交后才能读取数据,有效的避免脏读,但是一个事务进行了两次相同的查询而返回了不同的数据,这就是不可重复读。

可重复读(Repeatable Read/RR)

又称为幻读,一个事物读可以读取到其他事务提交的数据,但是在RR隔离级别下,当前读取此条数据只可读取一次,在当前事务中,不论读取多少次,数据仍然是第一次读取的值,不会因为在第一次读取之后,其他事务再修改提交此数据而产生改变。因此也成为幻读,因为读出来的数据并不一定就是最新的数据。

举个例子:某已婚男欲购买一套新房准备迎接新生命的到来,购房款 330万 ,付款的时候查询自己账号余额 360万(第一次查询),在这个时候,该已婚男子的爱人无法从该已婚男账户转出余额,接下来就可以正常付款了。

重复读可以解决不可重复读问题。写到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。

串行化(Serializable)

所有的数据库的读或者写操作都为串行执行,当前隔离级别下只支持单个请求同时执行,所有的操作都需要队列执行。所以种隔离级别下所有的数据是最稳定的,但是性能也是最差的。数据库的锁实现就是这种隔离级别的更小粒度版本。

Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。


 
上一篇 金三银四精选面试题-数据库的隔离级别、MVCC
下一篇 金三银四精选面试题-事务和MVCC原理

文章素材均来源于网络,如有侵权,请联系管理员删除。