Spring 声明式事务管理

所谓事务指的是一种用来保护数据完整性的机制 ,事务为与数据相关的操作定义了一个边界 ,并将他们组合在一起,以便这些操作的最终结果不会使底层数据处于不一致状态
ACID(原子性,一致性,隔离性,持久性)表示可靠的事务管理系统应该如何运行才能够在不牺牲性能要求的情况下,跨多个并发用户操作,保护数据完整性,以下是ACID 的属性介绍

  1. 原子性:在任何事务中,都可能在数据上上执行多个操作,这些操作必须全部成功或提交,如果由任何一个操作失败,则所有的操作都应该被抛弃,换句话说,所有的操作都必须被回滚,原子性也称为工作单元
  2. 一致性 为了让一个系统保持一致,一个活动事务结束之后底层数据库必须处于一致状态,例如
    如果没有订单就不能存在订单项,那么在没有添加一个订单之前,系统也不会让用户添加任何订单项
  3. 隔离性:隔离性定义了如何保护为提交数据免受其他并发事务的影响,隔离级别从最低保护(提供对为提交数据的访问)到最高保护(两个事务不能同时工作) 隔离性与并发现和一致性密切相关,如果提高了隔离级别,将会获得更高的一致性,但同步会失去并发性。另外一方面,如果降低了隔离级别,事务性将会提高,但会失去一致性
  4. 持久性
    当接收到一个成功提交消息时,系统就具有了持久性,从而可以确认所作的更改已经反映到系统中,而此后可以处理任何可能发生的系统故障,基本上,当提交时更改就变成永久而不会丢失
    通常,每一个数据处理SQL 是分别执行的,彼此之间完全独立,因此,除非调用了connection。setAutoCommimt(false) ,否则两个更新语句会分别执行,而他们所做的更改会马上反应到数据库中,并且对其他用户可见,如果某一个操作发生错误(如,第二条语句) ,那么第二条语句不会产生更改,但是由于第一条语句已经成功执行,其更改就变成永久的了,此时,系统将处于一种不一致状态,所以 使用connection。setAutoCommimt(false) 将激活事务,JDBC 会等待返回变化,直到事务结束,同时可以决定如何结束事务,使用commit 提交事务,还是使用rollback 回滚事务, 一般来说 提交之后所作的更改将反应到数据库,并且更改是永久的,且对其他用户可见,而回滚则抛弃所做的更改,底层数据库的数据保持不变

下面是spring 对事务的支持
spring 支持声明式事务,使用注解来选择需要使用事务的方法,当然,也可以对类使用注解,当类和方法同时使用事务注解时,类级别的注解会重载方法级别的注解 spring的事务,主要是基于AOP 的实现操作。在使用了声明式事务的注解的方法被调用时,spring会开启一个新的事务,当方法无异常运行结束后,spring会提交这个事务,否则回滚

spring中实现事务的具体步骤如下(由spring boot 实现)

  1. 在启动类中使用@EnableTransactionManagement 注解
    EnableTransactionManagement 注解激活基于注解的声明式事务管理, 程序在运行中Spring 容器会主动扫描@Transactional 注解的方法 和类 ,当找到后,spring 容器创建一个封装了实际bean 实例的代理 ,到调用bean中的方法时,首先由该代理实例截获该调用,并检查是否开始事务,如果是 ,则开始事务,然后调用实际目标bean 的方法来执行业务逻辑,当目标bean 的方法返回后,代理实例提交事务,并返回,如果事务方法中抛出异常,spring 将检查异常类型,以便确认是提交事务还是回滚 ,整个异常由 Transactional rollbackFor noRollbackFor 指定的异常来决定需要进行回滚的异常是那些 (当然 springboot 中,无需显示的开启使用@EnableTransactionManagement 因为spring boot 自动开启了注解事务的支持)
@SpringBootApplication
@EnableTransactionManagement
public class SpingbootmybatisApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpingbootmybatisApplication.class, args);
	}
}
  1. 在对应的方法或类上面 使用@Transactional 注解,并设置对应的注解行为 ,例如 rollbackfor 等等
    ,需要注意的是,如果在使用注解的方法里面使用了try catch 需要在catch 块中,当处理完异常后,手动将异常抛出

自定义事务行为
对于事务管理,事务行为是需要了解的,下面是一些自定义事务行为
在事务划分期间,可以使用Transactional 注解提供的一组默认属性,当然可以根据需要来更改默认的事务行为(在Transactional 添加对应的属性即可)

propagation 定义了事务范围,是否跨越多个方法调用等,主要有以下几种选择(默认值为REQUIRED )

REQUIRD 方法A 新建一个事务,当方法A调用方法B 的时候,方法B 也将使用相同的事务,如果方法B 发生异常需要回滚,则整个事务数据回滚

REQUIRES_NEW 对于方法AB ,在调用方法时每个方法都开启一个事务,如果方法B 有异常,则只回滚对应方法的事务

NESTED 与REQUIRES_NEW 类似 。但是没有两个独立的事务,只有一个跨不同方法调用的活动事务 ,通过保存点来标记新的方法的调用,当在第二个方法发生异常时,在最后一个保存点之前的事务都将回滚

isolation 指定了底层数据库的隔离级别 (默认为DEFAULLT)

timeout 指定事务超时时间。默认为当前数据库的事务超时时间,可以直接将其传递给底层数据库

readOnly 指定当前事务是否只读事务 默认为false

rollbackFor 指定某个,或者某些异常可以引起事务回滚,

noRollbackFor 指定某些异常不可以引起事务回滚

//方法级别的事务
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void insertUser(User user) {
        userMapper.insertSelective(user);
    }
//类级别的事务
@Transactional(rollbackFor = Exception.class)
public class UserImpl implements IUser {
}

事务的级别:
类级别的事务 :在类级别使用Transactional ,如果在类级别使用注解,那么类中的所有的公共方法都被事务

方法级别的事务: 在方法上使用Transactional 。需要注意的是 ,如果一个类中,同时存在类级别和方法级别事务 方法级别的Transactional 注解会重写在类级别使用的事务行为
demo 代码:srping boot 实现事务管理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值