SpringJDBC中的事务

本文详细介绍了Spring JDBC中的事务管理,包括@Transactional注解的使用,如何在接口和实现类上配置事务,以及事务的开启、提交和回滚。此外,还探讨了事务的七大传播机制,如REQUIRED和requires_new等,并提到了事务传播在新线程中的失效问题及其解决方案。最后,强调了在处理多个事务时选择合适传播机制的重要性。
摘要由CSDN通过智能技术生成

一.什么是事务

事务是一种能够保证同一个业务中多个写操作(增删改)要么全部成功,要么全部失败的一种机制

二.添加事务

在业务方法上添加@Transactional注解即可保证该业务是事务性的,即要么业务中的所有写操作要么全部成功,要么全部失败

此注解可以添加在:

接口:

会使得此接口的所有实现方法都是事务性的

接口的抽象方法:

会使得此接口的实现类中,重写的此方法是事务性的

只作用于当前方法

如果接口上也配置了此注解,并且接口和抽象方法的注解均配置了参数,以方法上的配置为准

业务实现类:

会使得当前类中的所有重写的方法都是事务性的

自定义方法不会是事务性的

业务实现类中的方法:

不可以添加在自定义的(不是重写的)方法上---语法上允许,但是执行的时候不允许,SpringJDBC是通过接口代理的方式进行事务管理,所以,只对接口中声明的方法有效

会使得此实现类中,重写的此方法是事务性的

只作用于当前方法

如果实现类上也配置了此注解,并且实现类和方法的注解均配置了参数,以方法上的配置为准

通常,应该将此注解添加在接口的抽象方法上(或者为了避免遗漏,可以添加在接口上)

三.SpringJDBC中处理事务的机制

SpringJDBC中处理事务的机制大致是:

开启事务:Begin
try{
    你的业务方法
    提交:commit
}catch(RuntimeException e){
    回滚:rollback
}

所以,为了保证事务性,所有的写操作在执行之后,必须有某个判定失败的标准,且判定失败后,必须抛出RuntimeException或其子孙类异常

SpringJDBC默认对RuntimeException进行回滚处理,有必要的话,也可以配置为其他异常类型

四.事务传播机制(在注解中的参数部分添加)

当多个事务同时存在的时候,spring如何处理这些事务的行为.事务传播机制实际上是使用简单的ThreadLocal实现的.如果调用的方法是在新线程调用的,事务传播是会失效的.

如何解决失效:可考虑全局事务,否则就加锁处理

7大事务传播机制:

1.Propagation_Required:默认传播行为,如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务.

2.propagation_requires_new:无论当前存不存在事务,都创建新事务进行执行

3.PROPAGATION_SUPPORTS:如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行。

4.PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起

5.PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUIRED属性执行。

6.PROPAGATION_MANDATORY:如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。

7.PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

上述传播机制中,最常用的是Required和requires_new

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值