赞
踩
// 源码 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Transactional { @AliasFor("transactionManager") String value() default ""; @AliasFor("value") String transactionManager() default ""; String[] label() default {}; Propagation propagation() default Propagation.REQUIRED; Isolation isolation() default Isolation.DEFAULT; int timeout() default TransactionDefinition.TIMEOUT_DEFAULT; String timeoutString() default ""; boolean readOnly() default false; Class<? extends Throwable>[] rollbackFor() default {}; String[] rollbackForClassName() default {}; Class<? extends Throwable>[] noRollbackFor() default {}; String[] noRollbackForClassName() default {}; }
value 属性与 transactionManager属性互为别名,用于指定事务管理器。当存在多个数据源时,往往需要不同的数据源,使用不同的事物管理器,可以使用value属性,或者transactionManager属性指定具体的事物管理器。
@see value
事务的传播行为
假设当前有两个方法 A, B。方法A 调用了 方法B, A与B有都具有事务,当A 调用B 后,B的事务该怎样变化呢,这个就取决于设置的事务传播行为。事实上 B 的事务,大致有三种情况:第一 开启新的事务;第二 加入 A的事务;第三 以非事务的方式运行;
以下的例子均为 A 调用 B
PROPAGATION_REQUIRED
:也是默认的事务传播行为。如果当前存在事务,则加入当前事务;如果当前不存在事务,则开启一个新的事务
PROPAGATION_SUPPORTS
:如果当前存在事务,则加入当前事务(A,B同一个事务);如果当前不存在事务,则也不开启事务PROPAGATION_MANDATORY
:如果当前存在事务,则加入当前事务 (同一个事务);如果当前不存在事务,则抛出异常PROPAGATION_REQUIRES_NEW
:重新开启一个新事物;
PROPAGATION_NOT_SUPPORTED
:以非事务的方式运行,如果当前存在事务,当前事务只会对A生效,不会对B生效PROPAGATION_NEVER
:以非事务的方式运行,如果当前存在事务,抛出异常PROPAGATION_NESTED
如果当前存在事务,则会作为当前事务的嵌套事务来继续运行。如果当前不存在事务,则会开启一个新事务。
事务的隔离级别
事务的隔离级别即在多并发的情况下,多个事务之间的隔离程度
Isolation.DEFAULT
使用数据库默认的隔离级别。mysql 默认可重复读;oracle默认读已提交Isolation.READ_UNCOMMITTED
读未提交
Isolation.READ_COMMITTED
读以提交;可以避免脏读,但是幻读和不可重复读依然可能发生Isolation.REPEATABLE_READ
可重复读;可以避免脏读和不可重复读,但是幻读可能发生Isolation.SERIALIZABLE
序列化;可以避免脏读,幻读,不可重复读。但是严重影响程序性能事务超时时间;即当事务运行时间超过 timeout时,会自动回滚事务,默认值为 -1 ,不设置超时时间
只读;只允许事务进行查询操作,对于一次执行多条查询语句的,可以开启readOnly,可以保证整体读一致性。默认false
事务回滚规则,接收指定异常进行回滚
事务回滚规则
@see rollbackFor
@see rollbackForClassName
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。