public interface TransactionDefinition { // 返回事务的传播行为 default int getPropagationBehavior() { return PROPAGATION_REQUIRED; } // 返回事务的隔离级别,事务管理器根据它来控制另一个事务能够看到本事务内的哪些数据 default int getIsolationLevel() { return ISOLATION_DEFAULT; } // 返回事务必须在多少秒内完成 default int getTimeout() { return TIMEOUT_DEFAULT; }; // 事务是否只读,事务管理器可以根据这个返回值进行优化 default boolean isReadOnly() { return false; } }
事务的第一个方面是传播行为(propagation behavior)。当事务方法被另外一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在本身的事务中运行。Spring定义了七种传播行为java
传播行为
|
含义
|
PROPAGATION_REQUIRED
|
表示当前方法必须运行在事务中。若是当前事务存在,方法将会在该事务中运行。不然,会启动一个新的事务
|
PROPAGATION_SUPPORTS
|
表示当前方法不须要事务上下文,可是若是存在当前事务的话,那么该方法会在这个事务中运行
|
PROPAGATION_MANDATORY
|
表示该方法必须在事务中运行,若是当前事务不存在,则会抛出一个异常
|
PROPAGATION_REQUIRED_NEW
|
表示当前方法必须运行在它本身的事务中。一个新的事务将被启动。若是存在当前事务,在该方法执行期间,当前事务会被挂起。
|
PROPAGATION_NOT_SUPPORTED
|
表示该方法不该该运行在事务中。若是存在当前事务,在该方法运行期间,当前事务将被挂起。
|
PROPAGATION_NEVER
|
表示当前方法不该该运行在事务上下文中。若是当前正有一个事务在运行,则会抛出异常
|
PROPAGATION_NESTED
|
表示若是当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务能够独立于当前事务进行单独地提交或回滚。若是当前事务不存在,那么其行为与PROPAGATION_REQUIRED同样。注意各厂商对这种传播行为的支持是有所差别的。能够参考资源管理器的文档来确认它们是否支持嵌套事务
|
事务的隔离级别定义一个事务可能受其余并发务活动活动影响的程度。数据库
隔离级别
|
含义
|
ISOLATION_DEFAULT
|
使用后端数据库默认的隔离级别
|
ISOLATION_READ_UNCOMMITTED
|
最低的隔离级别,容许读取还没有提交的数据变动,可能会致使脏读、幻读或不可重复读
|
ISOLATION_READ_COMMITTED
|
容许读取并发事务已经提交的数据,能够阻止脏读,可是幻读或不可重复读仍有可能发生
|
ISOLATION_REPEATABLE_READ
|
对同一字段的屡次读取结果都是一致的,除非数据是被自己事务本身所修改,能够阻止脏读和不可重复读,但幻读仍有可能发生
|
ISOLATION_SERIALIZABLE
|
最高的隔离级别,彻底服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读,也是最慢的事务隔离级别,由于它一般是经过彻底锁定事务相关的数据库表来实现的
|
默认状况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚(这一行为与EJB的回滚行为是一致的可是你能够声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。一样,你还能够声明事务遇到特定的异常不回滚,即便这些异常是运行期异常。后端