事务的隔离级别
事务隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度,当多个事务同时访问相同数据时,如果没有采取必要的隔离机制,就可能发生以下问题:
![92d0640245d86266bde5fcae11243d8e.png](https://i-blog.csdnimg.cn/blog_migrate/da4e0c42d036dbf9ab2090b23769c3d3.jpeg)
后期文章会首发于本专栏,欢迎关注,点赞
JAVA高级进阶zhuanlan.zhihu.com![11c494c2de375d298b2b9d8fdc37b793.png](https://i-blog.csdnimg.cn/blog_migrate/c02ea82637e5455abb01bcaf1a6bf875.jpeg)
Spring支持的隔离级别
![4a5e8db490a1466957ac0055b185fee8.png](https://i-blog.csdnimg.cn/blog_migrate/545c4022f848f46d103d84775c9d05f8.jpeg)
![55712de6e7bdc8f636cb97f65a221edd.png](https://i-blog.csdnimg.cn/blog_migrate/7f7d947d08a2cd9691fb81c28ff1e7f1.png)
再必须强调一遍,不是事务隔离级别设置得越高越好,事务隔离级别设置得越高,意味着势必要花手段去加锁用以保证事务的正确性,那么效率就要降低,因此实际开发中往往要在效率和并发正确性之间做一个取舍,一般情况下会设置为READ_COMMITED,此时避免了脏读,并发性也还不错,之后再通过一些别的手段去解决不可重复读和幻读的问题就好了。
Spring设置事务隔离级别
配置文件的方式
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="fun*" propagation="REQUIRED" isolation="DEFAULT"/>
</tx:attributes>
</tx:advice>
注解的方式
@Transactional(isolation=Isolation.DEFAULT)
public void fun(){
dao.add();
dao.udpate();
}
总结
Spring建议的是使用DEFAULT,就是数据库本身的隔离级别,配置好数据库本身的隔离级别,无论在哪个框架中读写数据都不用操心了。而且万一Spring没有把这几种隔离级别实现的很完善,出了问题就麻烦了。
最后,分享一份进阶宝典《Java核心知识点整理.pdf》,覆盖了JVM、Dubbo、锁、高并发、反射、mybatis、Spring原理、微服务、Zookeeper、数据库、数据结构等等,获取请点击下方文档即可
Java高级架构学习资料分享+架构师成长之路713dbae4.wiz03.com