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。