spring中的事务管理(四)

spring中的事务管理(四)


超时和只读属性

由于事务可以在行和表上获得锁,  因此长事务会占用资源, 并对整体性能产生影响.

如果一个事务只读取数据但不做修改, 数据库引擎可以对这个事务进行优化.

超时事务属性: 事务在强制回滚之前可以保持多久. 这样可以防止长期运行的事务占用资源.

只读事务属性: 表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务.

 

超时和只读属性可以在@Transactional 注解中定义.超时属性以秒为单位来计算.


在事务通知中, 超时和只读属性可以在 <tx:method> 元素中进行指定.

扫描二维码关注公众号,回复: 190519 查看本文章

 

事务中的属性设置(@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(){}

 

 

 

猜你喜欢

转载自blog.csdn.net/dl0246/article/details/78609591
今日推荐