package javax.transaction;
import javax.enterprise.util.Nonbinding;
import javax.interceptor.InterceptorBinding;
import java.lang.annotation.*;
/**
* 目的:事务注解@Transactional
*
* <p>@Transactional注解使CDI管理bean,类定义符合Java EE的规范,同时在
* 类和方法级别上注解。注解的方法覆盖该注解的类。参考EJB规范。
*
* <p>该支持提供一个通道,使CDI拦截器执行必要的暂停、恢复等等。事务拦截器仅对业务方法
* 调用进行交互,而不是在生命周期事件上。在一个未指定的事务上下文中调用生命周期方法。
*
* <p>带有@Transactional和事务的bean或方法中,尝试调用UserTransaction接口中
* 的任何方法。TxType除了NOT_SUPPORTED或NEVER外,将抛出IllegalStateException
* 异常。允许在生命周期事件中使用UserTransaction接口的方法。不管任何@Transactional注解,
* TransactionSynchronizationRegistry都将会被使用。
*
* <p>事务拦截器的优先权Interceptor.Priority.PLATFORM_BEFORE+200。更多
* 细节参看拦截器规范。
*
* <p>在事务上下文中,注解的元素TxType指示是否要执行bean方法。默认是TxType.REQUIRED。
*
* <p>默认情况下,检查异常和运行时异常的实例及其子类,不会导致事务拦截器标记的事务回滚。
* 但是可以在异常中指定回滚。
*
* <p>rollbackOn元素使拦截器标记的事务进行回滚。
*
* <p>当一个类指定是这两种元素,指定的行为也适用于该类的子类。如果两个元素使用,
* dontRollbackOn优先。
* @author TCM
* @create 2017年10月30日下午1:46:18
* @since JTA1.2
*/
@Inherited
@InterceptorBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Transactional {
/**
* 在事务上下文中,注解的元素TxType指示是否要执行bean方法。默认是TxType.REQUIRED。
*/
TxType value() default TxType.REQUIRED;
public enum TxType {
/**
* <p>若果在事务上下之外被调用,则拦截器必须开始一个新的JTA事务。从而在事务上下文中,
* 托管bean的方法继续被执行,事务必须完成。
*
* <p>若果在事务上下之内被调用,托管bean的方法被执行。
*
* <p>总之,事务上下文中,必须有个JTA事务。
*/
REQUIRED,//执行方法时,必须有个事务,没有事务则创建
/**
* <p>若果在事务上下之外被调用,则拦截器必须开始一个新的JTA事务。从而在事务上下文中,
* 托管bean的方法继续被执行,事务必须完成。
*
* <p>若果在事务上下之内被调用,当前事务上下文必须暂停,创建一个新的JTA事务,托管
* bean的方法被执行完成。之前暂停的事务,重新恢复。
*/
REQUIRES_NEW,//执行方法时,即使有事务,也要创建新的事务
/**
* <p>若果在事务上下之外被调用,TransactionalException异常嵌套一个
* TransactionRequiredException异常被抛出。
*
* <p>若果在事务上下之内被调用,托管bean的方法被执行。
*/
MANDATORY,//事务上下外不能执行该方法,否则抛出异常
/**
* <p>若果在事务上下之外被调用,托管bean的方法也会被执行。
*
* <p>若果在事务上下之内被调用,托管bean的方法被执行。
*/
SUPPORTS,//事务上下内/外都可以执行该方法
/**
* <p>若果在事务上下之外被调用,托管bean的方法也会被执行。
*
* <p>若果在事务上下之内被调用,当前事务上下文必须暂停,托管bean的方法将在事务
* 上下之外被执行。之前暂停的事务,重新恢复。
*/
NOT_SUPPORTED,//事务上下文内不执行该方法
/**
* <p>若果在事务上下之外被调用,托管bean的方法也会被执行。
* <p>若果在事务上下之内被调用,TransactionalException异常嵌套一个
* TransactionRequiredException异常被抛出。
*/
NEVER //事务上下文不执行该方法,否则抛出异常
}
/**
* rollbackOn设置到指定的异常中,若是拦截器标记的事务出现该异常时,事务将回滚。
* 相反,dontRollbackOn设置将不会出现回滚。
* 当一个类有这些元素中的任何一个,指定的行为也适用于该类的子类。如果两个元素都有,
* dontRollbackOn优先。
* @return Class[] of Exceptions
*/
@Nonbinding
public Class[] rollbackOn() default {};
@Nonbinding
public Class[] dontRollbackOn() default {};
}
package javax.transaction;
/**
* 目的:事务同步,即:事务完成前后调用的方法
*
* <p>事务管理器支持同步机制,在事务完成的前/后,调用该接口中的方法。使用
* javax.transaction.Transaction.registerSynchronization()
* 方法,应用服务器可以为当前目标事务对象的事务注册一个Synchronization对象。
* @author TCM
* @create 2017年10月31日下午2:06:47
*/
public interface Synchronization {
//two-phase(两阶段)事务提交之前执行的方法
public void beforeCompletion();
//事务提交或回滚之后执行的方法
public void afterCompletion(int status);
}