Spring 事务

Spring 事务支持两种使用方式,分别是:

  • 编程式事务(代码方式)

  • 声明式事务(注解方式)

Spring 事务中的隔离级别

在 TransactionDefinition 接口中定义了五个表示隔离级别的常量:

  • ISOLATION_DEFAULT:使用后端数据库默认的隔离级别,Mysql 默认采用的 REPEATABLE_READ 隔离级别;Oracle 默认采用的 READ_COMMITTED 隔离级别。

  • ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

  • ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

  • ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被当前事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

  • ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

Spring 事务中有哪几种事务传播行为?

在 TransactionDefinition 接口中定义了 7 个表示事务传播行为的常量:

  • PROPAGATION_REQUIRED

    • 如果当前存在事务,则加入该事务;

    • 如果当前没有事务,则创建一个新的事务。

    这是最常见的选择,也是 Spring 默认的事务的传播。

  • PROPAGATION_SUPPORTS

    • 如果当前存在事务,则加入该事务;

    • 如果当前没有事务,则以非事务的方式继续运行。

  • PROPAGATION_MANDATORY

    • 如果当前存在事务,则加入该事务;

    • 如果当前没有事务,则抛出异常。

  • PROPAGATION_REQUIRES_NEW

    • 创建一个新的事务;

    • 如果当前存在事务,则把当前事务挂起。

    新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作

  • PROPAGATION_NOT_SUPPORTED

    • 以非事务方式运行;

    • 如果当前存在事务,则把当前事务挂起。

  • PROPAGATION_NEVER

    • 以非事务方式运行;

    • 如果当前存在事务,则抛出异常。

  • PROPAGATION_NESTED

    • 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;

    • 如果当前没有事务,则按照 PROPAGATION_REQUIRED 执行。

    它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。

    内部事务的回滚不会对外部事务造成影响。

    它只对 DataSourceTransactionManager 事务管理器起效。

Last updated