package org.springframework.transaction.annotation;
import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional
{
public abstract Propagation propagation();
public abstract Isolation isolation();
/**该属性用于设置事务的超时秒数,默认值为-1表示永不超时*/
public abstract int timeout();
/**该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。
例如:@Transactional(readOnly=true)*/
public abstract boolean readOnly();
/**该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚.例如:
指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)
指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})*/
public abstract Class<? extends Throwable>[] rollbackFor();
/**该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false.
例如:@Transactional(readOnly=true)*/
public abstract String[] rollbackForClassName();
/**指定不回滚
指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)
指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})*/
public abstract Class<? extends Throwable>[] noRollbackFor();
/**该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:
指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException")
指定多个异常类名称:@Transactional(noRollbackForClassName={"RuntimeException","Exception"})*/
public abstract String[] noRollbackForClassName();
}
/*@Transactional(propagation=Propagation.NESTED) 的代码解释*/
public void methodName(){
// 本类的修改方法 1
update();
// 调用其他类的修改方法
otherBean.update();
// 本类的修改方法 2
update();
}
//other失败了不会影响 本类的修改提交成功
//本类update的失败,other也失败
package org.springframework.transaction.annotation;
public enum Isolation
{
/**使用数据库默认的隔离级别*/
DEFAULT(-1),
/**允许读取改变了的还未提交的数据,可能导致脏读'不可重复读和幻读*/
READ_UNCOMMITTED(1),
/**允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读*/
READ_COMMITTED(2),
/**对相同字段的多次读取结果一致,可导致幻读*/
REPEATABLE_READ(4),
/**完全服从ACID的原则,确保不发生脏读、不可重复读和幻读*/
SERIALIZABLE(8);
private final int value;
private Isolation(int value)
{
this.value = value;
}
public int value() { return this.value; }
}
package org.springframework.transaction.annotation;
public enum Propagation
{
/**如果有事务,那么加入事务,没有的话新建一个(不写的情况下)*/
REQUIRED(0),
/**如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.*/
SUPPORTS(1),
/**必须在一个已有的事务中执行,否则抛出异常*/
MANDATORY(2),
/**不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务*/
REQUIRES_NEW(3),
/**声明方法不需要事务.如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行*/
NOT_SUPPORTED(4),
/**必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)*/
NEVER(5),
/**如果一个活动的事务存在,则运行在一个嵌套的事务中.如果没有活动事务,则按REQUIRED属性执行.它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点.内部事务的回滚不会对外部事务造成影响.它只对DataSourceTransactionManager事务管理器起效*/
/**如果当前存在一个事务,则该方法运行在一个嵌套的事务中.被嵌套的事务可以从当前事务中单独的提交和回滚.如果当前不存在事务,则开始一个新的事务.各厂商对这种传播行为的支持参差不齐,使用时需注意*/
NESTED(6);
private final int value;
private Propagation(int value)
{
this.value = value;
}
public int value() { return this.value; }
}