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框架中的事务属性包括以下几个方面:
- 传播行为(Propagation Behavior):指定事务方法被嵌套调用时,事务如何传播到嵌套调用的方法中。例如,是否创建新的事务,是否加入现有的事务,等等。
- 隔离级别(Isolation Level):指定事务方法在访问数据时所采用的隔离级别,用于控制事务之间的数据可见性。例如,读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)等。
- 回滚规则(Rollback Rules):指定在哪些异常情况下事务应该回滚。可以配置一组异常类型,当方法抛出这些异常时,事务将会回滚。
- 超时时间(Timeout):指定事务的超时时间,即事务执行的最大时长。如果在指定的时间内事务没有完成,则会自动回滚。
- 只读(Read-Only):指定事务是否为只读事务。只读事务可以优化数据库访问,但是不能用于写操作。
- 回滚标志(Rollback Only):指定是否将事务标记为只读。如果将事务标记为只读,则事务将被标记为仅回滚,而不是回滚到保存点。
通过合理配置这些事务属性,可以对事务进行精细化的控制和管理,从而确保系统在并发操作下的数据完整性和一致性。