Spring 事务参数详解

spring 中的事务使用起来很简单,只需要在需要使用事务的方法上加上 Transactional 注解就好了。这个注解是有一个 Propagation 的参数。这个参数有默认值,所以使用的时候可以不指定,这里简单说一下这个参数的作用。

Propagation 参数的可选项

  • REQUIRED

    这是默认参数。作用是判断当前方法中有无事务,如果有的话,就将方法中是事务加进去,如果没有则新建一个事务。

    例如:A 调用 B,B 调用 C。A->B->C,C方法加上了 Transactional 注解,A方法也加上了 Transactional 注解,则 A 的事务会和C的事务合并成一个事务。这需要看具体的业务是否需要这样的特性,如果不需要则配置其他的参数。

  • REQUIRES_NEW

    创建一个新的事务,如果当前已经有了一个事务,则挂起该事务。

    例如:A 调用 B,B 调用 C。A->B->C,C方法加上了 REQUIRES_NEW 参数。A 方法有一个事务,则调用到 C 的时候,则新建一个事务,并且挂起(暂停)A 的事务。如果A,B都没有事务,那 C 就会直接新建一个事务。

  • SUPPORTS

    如果当前有事务,则使用事务,如果当前没有事务则不使用事务。

    例如:A 调用 B,B 调用 C。A->B->C,C方法加上了 SUPPORTS 参数,但是A,B没有事务。这种情况下A,B,C都不会使用事务。

  • NOT_SUPPORTED

    当前方法运行的时候,如果已经有事务,则挂起,当前方法以无事务的状态运行。

    例如:A 调用 B,B 调用 C。A->B->C,C方法加上了 NOT_SUPPORTED 参数。A方法有一个事务,则会挂起(暂停)当前事务。然后运行C的代码。

  • MANDATORY

    当前方法必须运行在事务的环境中,如果当前方法运行的时候没有事务,则抛异常。

    例如:A 调用 B,B 调用 C。A->B->C,C方法加上了 MANDATORY 参数。但是A,B没有使用事务,则调用到C的时候抛出异常。

  • NEVER

    当前方法以没有事务的状态运行,如果当前已经有了一个事务则抛出异常。

    例如:A 调用 B,B 调用 C。A->B->C,C方法加上了 NEVER 参数。A方法有一个事务,则抛异常。如果A,B都没有事务则运行C。

  • NESTED

    当前方法运行的时候如果有事务,则嵌套一个子事务。如果运行的时候没有事务,则新建一个事务。

    例如:A 调用 B,B 调用 C。A->B->C,C方法加上了 NESTED 参数。A方法有一个事务,则新建一个子事务去运行C,C的事务结束了再去运行A的事务。如果A,B都没有事务,则C会新建一个事务去运行C。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。