Spring事务(1)基本概念

1 事务概念

事务指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败。

事务的特性:原子性、一致性、隔离性、持久性

原子性是指事务是一个不可分割的工作单位。事务中的操作要么都发送,要么都不发生

一致性指事务前后数据的完整性必须保持一致

隔离性指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离

持久性是指一个事务一旦被提交,它对数据库中数据的改变是永久性的,即使数据库发生故障也不应该对其有任何影响。

 

例子:张三账户有2000元,李四账户有2000元。张三给李四转账1000元,张三账户扣除1000元,李四的账户加上1000元,不能够出现张三账户的钱被扣了,李四账户的钱没有增加(原子性)。两个账户总共4000元,执行完后两个账户总和还是4000元(一致性)。不能两个事务同时对一条记录进行修改,可能会出现修改记录被覆盖的情况(隔离性)

2 Spring提供的事务API介绍

平台事务管理器接口用来管理事务,里面包含事务的提交、回滚等操作;

事务定义信息接口主要用来定义事务的属性,包括事务的隔离级别、传播行为,是否超时、是否只读等;

事务具体运行状态接口主要用来获取事务的状态,包括事务是否被提交、是否有保存点、是否是一个新的事务等状态

Spring事务管理过程:首先会使用事务定义信息接口设置事务的属性,然后由平台事务管理器进行真正的事务管理,在事务管理过程中会产生一些事务状态,保存在事务具体运行状态对象中。

2.1 平台事务管理器

2.2 事务定义信息 TransactionDefinition

该接口提供了一组常量,定义事务的隔离级别、传播行为、超时信息

提供了几个方法,可以获得事务的隔离级别,传播行为,超时信息,是否只读

事务隔离级别

如果不考虑事务的隔离性,会引发安全问题:脏读、不可重复读、幻读

脏读:一个事务读取了另一个事务改写但未提交的数据,如果这些数据被回滚,则读到的数据是无效的。

不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。

幻读:一个事务读取了几行记录后,另外一个事务插入一些记录,幻读就发生了。在后来的查询中,第一个事务就会发现有些原来没有的记录。

数据库的事务隔离级别:

Mysql数据库默认采用repeatable_read隔离级别;Oracle默认采用read_committed隔离级别

Spring的TransactionDefinition接口提供了以下5个事务隔离级别,来设置事务的隔离级别属性

事务传播行为

事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。

事务传播行为的作用:

我们在开发的过程中会有Web层,Service层,dao层。事务一般是加在service层的方法上的。比如service1中的aaa方法是一个事务,service2中的bbb方法也是一个事务。那么就会存在一种复杂的情况,aaa方法中调用了bbb方法。那么这个时候就需要事务传播行为,其作用是:解决业务层方法之间相互调用的问题

Spring的TransactionDefinition接口提供了以下7个事务传播行为,来设置事务的传播行为属性

前三种是设置两个方法在同一个事务中,4-6是设置两个方法不在同一个事务中

最后一个,是当第一个方法执行完之后设置一个保存点,如果后一个方法执行失败,那么回滚到这个保存点或者回滚到最初状态

2.3 事务状态接口

作用:获得或者判断事务的状态

hasSavepoint是否有保存点

isCompleted() 是否完成

isNewTransaction() 是否是新的事务

isRollbackOnly() 是否回滚

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值