spring中的事务管理(四)
超时和只读属性
由于事务可以在行和表上获得锁, 因此长事务会占用资源, 并对整体性能产生影响.
如果一个事务只读取数据但不做修改, 数据库引擎可以对这个事务进行优化.
超时事务属性: 事务在强制回滚之前可以保持多久. 这样可以防止长期运行的事务占用资源.
只读事务属性: 表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务.
超时和只读属性可以在@Transactional 注解中定义.超时属性以秒为单位来计算.
在事务通知中, 超时和只读属性可以在 <tx:method> 元素中进行指定.
事务中的属性设置(@Transactional)
propagation属性:用来设置事务的传播行为 -Propagation.REQUIRED:默认,使用调用者的事务 -Propagation.REQUIRES_NEW:开启一个新事务
isolation属性:用来设置事务的隔离级别 -Isolation.REPEATABLE_READ:可重复读,Mysql默认的隔离级别 -Isolation.READ_COMMITTED:读已提交,Oracle默认的隔离级别,也是常有的隔离级别
rollbackFor属性:用来设置出现什么异常时才回滚,值是一个数组,里面放的是异常的类型 rollbackForClassName属性:用来设置出现什么异常时才回滚,值是一个数组,里面放的是异常的名字 noRollbackFor属性:用来设置出现什么异常不回滚,值是一个数组,里面放的是异常的类型 norollbackForClassName属性:用来设置出现什么异常时不回滚,值是一个数组,里面放的是异常的名字
timeout属性:用来设置超时的时间,单位是秒
readOnly属性:用来设置当前操作是一个只读的操作,通常对数据库进行查询操作时设置该属性为true
@Transactional(propagation=Propagation.REQUIRES_NEW , isolation=Isolation.READ_COMMITTED, noRollbackFor={ArithmeticException.class},timeout=3,readOnly=false)
|
切入点表达式
1、切入点表达式的格式:execution([可见性] 返回类型 [声明类型].方法名(参数) [异常])
2、切入点表达式通配符: *:匹配所有字符 ..:一般用于匹配多个包,多个参数 +:表示类及其子类
3、切入点表达式支持逻辑运算符:&&、||、!
4、切入点表达式关键词: 1)execution:用于匹配子表达式。 //匹配com.cjm.model包及其子包中所有类中的所有方法,返回类型任意,方法参数任意 @Pointcut("execution(* com.cjm.model..*.*(..))") public void before(){}
2)within:用于匹配连接点所在的Java类或者包。 //匹配Person类中的所有方法 @Pointcut("within(com.cjm.model.Person)") public void before(){}
//匹配com.cjm包及其子包中所有类中的所有方法 @Pointcut("within(com.cjm..*)") public void before(){}
3) this:用于向通知方法中传入代理对象的引用。 @Before("before() && this(proxy)") public void beforeAdvide(JoinPoint point, Object proxy){ //处理逻辑 }
4)target:用于向通知方法中传入目标对象的引用。 @Before("before() && target(target) public void beforeAdvide(JoinPoint point, Object proxy){ //处理逻辑 }
5)args:用于将参数传入到通知方法中。 @Before("before() && args(age,username)") public void beforeAdvide(JoinPoint point, int age, String username){ //处理逻辑 }
6)@within :用于匹配在类一级使用了参数确定的注解的类,其所有方法都将被匹配。 @Pointcut("@within(com.cjm.annotation.AdviceAnnotation)") - 所有被@AdviceAnnotation标注的类都将匹配 public void before(){}
|