Spring -- 事务管理

1.编程式事务 


这种需要自己手动编写事务代码的控制方式已经严重过时了,因为每个执行DML语句的操作都要编写一份这样的代码,相当的麻烦,Spring提供了一个抽象层:PlantformTransactionManager,事务管理器。封装了数据库事务几个方法,

commit、rollback、getTransaction。想在Spring平台使用事务,就必须提供一个

PlantformTransactionManager的子类,Spring有一个实现类:DataSourceTransactionManager。


2.Spring事务配置

Spring的事务控制是基于AOP编程思想上实现的,配置文件中需要的Schema:


tx包的地方也要有aop包。


a) 基本配置步骤:

1.首先声明一个Datasource,给事务管理器控制这个DataSource中的事务 



 2.声明一个Spring的事务管理器:



3.定义通知



意义:通知的概念知道AOP编程的都知道,不多BB ,数据库事务的前置后置通知的代码Spring是 已经封装好了的,直接指定就OK了。transaction-manager默认值是transactionManager,如果在声明管理器Bean的时候id为transactionManager,那么在这里是 不需要手动指定的,若不是,则手动指定 transaction-manager无论是获取连接、关闭自动提交、等前置通知,还是异常回滚的异常通知、 业务代码 执行完后提交事务的后置通知,Spring都帮我们把相关的逻辑封装好了, 只需要专注自己的业务逻辑即可。

name:

用于指定需要事务支持的方法,update*指的是update开头的所有方法,以此类推。


propagation(传播级别):

    REQUIRED:如果父方法没有事务就创建一个事务,如果有就使用当前事务。

    REQUIRED_NEW:无论父方法有没有事务,都创建一个新的

    SUPPORTS: 如果父方法没有事务则使用JDBC的事务(自动提交),否则使用父方法的事务

    NOT_SUPPORTS:无论父方法有没有事务,都是用JDBC的事务(挂起父方法的事务)。

    MANDATORY:如果方法没有运行在Spring事务中就抛出异常,必须在事务环境下运行

    NEVER:父方法不能存在事务,有事务就抛出异常


4.切点关联

  关联到上方定义的通知即可:




b) 设置回滚事务属性:

   

   Spring事务管理中异常回滚默认情况下只对RuntimeException有效,非运行时异常是不会回滚的。不过<tx:method>标签中有两个属性可以指定遇到哪种类型的异常时回滚数据:

    

    rollback - for:指定会自动回滚的非运行时异常,IO异常、反射异常、SQL异常等等。

    no - rollback - for:指定不会回滚的运行时异常,空指针、下标越界等等。

    

事务的回滚规则可以通过@Transactional 注解或者配置文件设置:

 

1.注解:通过rollbackFor 和 noRollbackFor 属性来定义。

这两个属性被声明为 Class[] 类型的, 因此可以为这两个属性指定多个异常类:



Spring 2.x 事务通知中, 可以在 <tx:method> 元素中指定回滚规则,如果有不止一种异常, 用逗号分隔:


c) 超时和只读属性

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

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

 

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

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

    

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



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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值