事务
IT面试
867 ·
1 ·
2023-02-08 16:48:26
最新编辑原因:

事务什么场景下会失效?

  1. 访问权限问题
    访问权限是private、default或protected的话,spring则不会提供事务功能。只有public方法才会提供事务

  2. 方法用final修饰

    • 如果你看过spring事务的源码,可能会知道spring事务底层使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。 但如果某个方法用final修饰了,那么在它的代理类中,就无法重写该方法,而添加事务功能。

    • 如果某个方法是static的,同样无法通过动态代理,变成事务方法

  3. 方法内部调用
    在普通方法中,调用事务方法。因为这种方法直接调用了this对象的方法,所以updateStatus方法不会生成事务。没有走spring代理

  4. 未被spring管理

  5. 多线程调用

    • 不在同一个线程中,获取到的数据库连接不一样,从而是两个不同的事务

    • spring的事务是通过数据库连接来实现的。当前线程中保存了一个map,key是数据源,value是数据库连接

    • 我们说的同一个事务,其实是指同一个数据库连接,只有拥有同一个数据库连接才能同时提交和回滚。如果在不同的线程,拿到的数据库连接肯定是不一样的,所以是不同的事务。

  6. 表不支持事务

  7. 未开启事务

  8. 错误的传播特性

  9. 自己吞了异常

  10. 手动抛了别的异常

  11. 自定义了回滚异常

  12. 嵌套事务回滚多了

  13. 大事务问题: 解决方案可以使用TransactionTemplate编程式事务

 

1-5点事务不生效; 6-12点事务不回滚

本作品系原创,采用《署名-非商业性使用-禁止演绎4.0 国际》许可协议.转载请说明出处
本文链接:https://www.upupor.com/u/XOR8oYL 复制
评论1
fsec
fsec 近7天新增
2023-11-30 13:30:43 ·  回复 · 1#

1111

推荐阅读