spring boot 集成shiro的配置

首先,http://blog.csdn.net/yuxin6866/article/details/52649048 这篇博客关于不可重复读和幻读的内容介绍的十分清晰
以下为自己理解:

事务总结: 
事务的特性:★★★ 
ACID 
原子性:事务里面的操作单元不可切割,要么全部成功,要么全部失败 
一致性:事务执行前后,业务状态和其他业务状态保持一致. 
隔离性:一个事务执行的时候最好不要受到其他事务的影响 
持久性:一旦事务提交或者回滚.这个状态都要持久化到数据库中 
不考虑隔离性会出现的读问题 
脏读:在一个事务中读取到另一个事务没有提交的数据 
不可重复读:在一个事务中,两次查询的结果不一致(针对的update操作) 
虚读(幻读):在一个事务中,两次查询的结果不一致(针对的insert操作) 
通过设置数据库的隔离级别来避免上面的问题(理解) 
read uncommitted 读未提交 上面的三个问题都会出现 
read committed 读已提交 可以避免脏读的发生 
repeatable read 可重复读 可以避免脏读和不可重复读的发生 
serializable 串行化 可以避免所有的问题



起初隔离级别为read uncommitted 读未提交;a,b两个会话,分别开启两个事务,然后a向b转了500元钱,但a未提交该事务, 
此时b查看,发现多了500.然后a回滚事务,b再查看账户,发现根本就没有多500.这便是脏读。 
脏读便是可以读取到另一个事务尚未提交的数据。 
如果我们此时将隔离级别提升为read committed 读已提交,便可避免脏读。同样b两个会话,分别开启两个事务,然后a向b转了500元钱, 
但a未提交该事务,此时b查看,依旧是原钱数. 
但此时,如果a 提交事务,b再去查看,发现此时多了500,对b而言,在一个事务中,两次查询的结果不一致,这便是不可重复读。 
如果我们此时将隔离级别提升为repeatable read 可重复读,可以避免脏读和不可重复读的发生。同样a 提交事务,b再去查看,发现 
依旧是原钱数,b只能结束当前事务,在开启一个新事务,才能查询到数据的变化,这al便避免了不可重复读。 
如果我们设置了seriizable串行化,就相当于锁表,某一时间内只允许一个事务访问该表。

猜你喜欢

转载自blog.csdn.net/qq_33535433/article/details/80925169