Spring事务简介,事务角色,事务属性

简介: Spring事务简介,事务角色,事务属性

1.Spring事务简介

  • 事务作用:在数据层保障一系列的数据库操作同成功同失败
  • Spring事务作用:在数据层或业务层保障一系列的数据操作同成功同失败
public interface PlatformTransactionManager{
  void commit(TransactionStatus status) throws TransactionException;
  void rollback(TransactionSattus status) throws TransactionException;
}
public class DataSourceTransactionManager{
  ...
}

案例:银行账户转账

需求:

实现任意两个账户间转账操作

需求微缩:

A账户减钱,B账户加钱

分析:

数据层提供基础操作,指定账户减钱(outMoney),指定账户加钱(inMoney)

业务层提供转账操作(transfer),调用减钱和加钱的操作

提供2个账号和操作金额执行转账操作

基于Spring整合MyBatis环境搭建上述操作

结果分析:

程序正常执行时,账号金额A减B加,没有问题

程序出现异常,转账失败,单是异常之前操作成功,异常之后操作失败,整体业务失败

2.事务角色

添加事务管理操作流程

在业务层接口上添加Spring事务管理

public interface AccountService{
  @Transactional
  public void transfer(String out,String in,Double money);
}

注意:Spring注解式事务通常添加在业务层接口中而不会添加到业务层实习类中,降低耦合度

注解式业务可以添加到业务方法上表示开启事务,也可以添加到接口上表示当前接口所有方法开启事务

设置事务管理

@Bean
public PlatformTransactionManager transactionManager(DataSource dataSoure){
  DataSouceTransactionManager ptm = new DataSourceTransactionManager();
  ptm.setDataSource(dataSource);
  return ptm;
}

注意:事务管理要根据实现技术进行选择MyBatis框架使用JDBC事务

开启注解事务驱动

@Configuration
@ComponentScan("com.hcx")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
@EnableTransactionManagement
public class SpringConfig{
}

Spring事务角色(通过相同数据源来管理)

事务角色

事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法

事务协调员:加入事务方,在Spring中通常带着数据层方法,也可以是业务层方法

事务相关配置

注意:IOException不属于运行时异常,事务回滚不管理

事务传播行为

事务传播行为:事务协调员对事务管理员所携带事务的处理态度

Spring中七种事务传播行为

事务传播行为类型说明

PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS  支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW  新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED  如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

案例:转账业务追加日志

需求:实现任意两个账户间转账操作,并对每次转账操作在数据库进行留痕

需求微缩:A账户减钱,B账户加钱,数据库记录日志

分析:

基于转账操作案例添加日志模块,实现数据库中记录日志

业务层转账操作(transfer),调用减钱,加钱与记录日志功能

实现效果预期:

无论转账是否成功,均进行转账操作的日志留痕

存在问题:

日志的记录与转账操作隶属于同一事务,同成功同失败

失效效果预取改进:

无论转账操作是否成功,日志必须保留

步骤

在业务层接口上添加Spring事务,设置事务传播行为REQUIRES_NEW(需要新事务)

@Service
public class LogServiceImpl implements LogService{
  @Autowired
  private LogDao logDao;
  @Transactional(propagation = Propagation.REQUIRES_NEW)
  public void log(String out,String in,Double money){
    logDao.log("转账操作由"+out+"到"+in+",金额:"+money);
  }
}

3.事务属性

在Spring框架中,事务属性(Transaction Attributes)是指在定义和管理事务时所使用的一组属性或配置,用于指定事务的行为和特性。Spring提供了一种声明式事务管理的方式,通过在方法或类级别上使用注解或XML配置来定义事务属性。

Spring框架中的事务属性包括以下几个方面:

  1. 传播行为(Propagation Behavior):指定事务方法被嵌套调用时,事务如何传播到嵌套调用的方法中。例如,是否创建新的事务,是否加入现有的事务,等等。
  2. 隔离级别(Isolation Level):指定事务方法在访问数据时所采用的隔离级别,用于控制事务之间的数据可见性。例如,读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)等。
  3. 回滚规则(Rollback Rules):指定在哪些异常情况下事务应该回滚。可以配置一组异常类型,当方法抛出这些异常时,事务将会回滚。
  4. 超时时间(Timeout):指定事务的超时时间,即事务执行的最大时长。如果在指定的时间内事务没有完成,则会自动回滚。
  5. 只读(Read-Only):指定事务是否为只读事务。只读事务可以优化数据库访问,但是不能用于写操作。
  6. 回滚标志(Rollback Only):指定是否将事务标记为只读。如果将事务标记为只读,则事务将被标记为仅回滚,而不是回滚到保存点。

通过合理配置这些事务属性,可以对事务进行精细化的控制和管理,从而确保系统在并发操作下的数据完整性和一致性。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
4天前
|
Java 关系型数据库 MySQL
【JavaEE】Spring事务-@Transactional参数介绍-事务的隔离级别以及传播机制
【JavaEE】Spring事务-@Transactional参数介绍-事务的隔离级别以及传播机制
9 0
|
4天前
|
消息中间件 Java 关系型数据库
【JavaEE】Spring事务-事务的基本介绍-事务的实现-@Transactional基本介绍和使用
【JavaEE】Spring事务-事务的基本介绍-事务的实现-@Transactional基本介绍和使用
8 0
|
4天前
|
SQL Java 关系型数据库
Spring 事务
Spring 事务
12 1
|
4天前
|
XML Java 数据格式
Spring 属性注入方式
Spring 属性注入方式
14 2
|
4天前
|
Java Apache Spring
Spring BeanUtils与Apache BeanUtils提供基本属性复制,适用于简单需求
【5月更文挑战第4天】Spring BeanUtils与Apache BeanUtils提供基本属性复制,适用于简单需求;Cglib BeanCopier用于转换为Cglib代理对象;Apache PropertyUtils处理属性操作;Dozer支持复杂对象映射。选择工具取决于具体需求,如需精细控制或对象映射,推荐Dozer或Apache PropertyUtils。Apache BeanUtils可能因潜在的封装性破坏被禁用。
24 3
|
4天前
|
Java 数据库连接 数据库
16:事务-Java Spring
16:事务-Java Spring
29 5
|
7月前
|
Java Spring
【Spring事务的实现原理】
【Spring事务的实现原理】
|
4天前
|
Java 关系型数据库 数据库连接
Spring源码解析--深入Spring事务原理
本文将带领大家领略Spring事务的风采,Spring事务是我们在日常开发中经常会遇到的,也是各种大小面试中的高频题,希望通过本文,能让大家对Spring事务有个深入的了解,无论开发还是面试,都不会让Spring事务成为拦路虎。
41 1
|
4天前
|
Java 关系型数据库 MySQL
深入分析Spring事务和底层原理
深入分析Spring事务和底层原理
42 1
|
8月前
|
Java Spring
Spring Boot 中的事务传播行为是什么,原理,如何使用
Spring Boot 中的事务传播行为是什么,原理,如何使用