事物并发产生的问题
脏读
不可重复读
事物A第一次读取后事物B进行了修改并提交,当事物A再次读取时发现两次读取不一致,这就是不可重复读。侧重的是数据的修改。
幻读
事物A第一次读取并修改了一批数据但未提交,并行的事物B插入或者删除了部分数据并提交,当事物A提交数据时发现数据数量或内容不对,这就是幻读。侧重的是数据的插入或删除。
事物的四种隔离级别
- read uncommitted读未提交
读写可并行,可以读到未提交数据,将导致脏读。
读读可并行,读写可并行,写写不可并行。
- read committed读已提交
只能读到提交的数据,排除了脏读但可能造成不可重复读。
读读可并行,读写可并行,写写不可并行。
- repeatable read可重复读
读数据时对读出的数据加锁防止写操作,避免了脏读和不可重复读但可能造成幻读。mysql默认的方式。
读读可并行,读写不可并行,写写不可并行。
- serlalizable可串行化
所有事物均排队串行执行,级别最高,效率最低。
Spring事物传播机制
- REQUIRED:没有就新建,有就加入。默认设置
- SUPPORTS:有事务就加入,没有则以非事务执行
- MANDATORY:有事务就加入,没有则报异常
- REQUIRES_NEW:任何情况都创建新事物
- NOT_SUPPORTED:如果当前存在事务,就把当前事务挂起
- NEVER:如果当前存在事务,则抛出异常
- NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。区别是嵌套事务,外层的事务如果回滚,会导致内层的事务也回滚;但是内层的事务如果回滚,仅仅是回滚自己的代码,不影响外层的事务的代码
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接,感谢各位看官!!!
本文出自:monkeyGeek
座右铭:生于忧患,死于安乐
欢迎志同道合的朋友一起交流、探讨!
