Spring框架提供了便捷的事务管理。不会对业务调用造成任何干扰。不需要手动开启,提交事务,只需要在类或者方法上进行少量的注解就可以自动完成这些操作。本篇主要介绍了@Transactional注解的使用。
一.概念
1.事务介绍
- 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部失败。
2.事务的特点
- 原子性(Atomicity): 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
- 一致性(Consistency): 事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。
- 隔离性(Isolation): 同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
- 持久性(Durability): 事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
二.Spring中的事务
1.事务管理器
-
事务管理器接口统一定义了不同持久框架的事务行为,例如(Jpa,Hibernate等)如下
public interface PlatformTransactionManager extends TransactionManager { //根据事务配置获取事务状态 TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException; //提交事务 void commit(TransactionStatus var1) throws TransactionException; //回滚事务 void rollback(TransactionStatus var1) throws TransactionException; }
2.事务属性定义
-
TransactionDefinition类定义了事务的所有行为,我们在@Transactional注解中使用的属性实际就是配置这些值
public interface TransactionDefinition { int PROPAGATION_REQUIRED = 0; int PROPAGATION_SUPPORTS = 1; int PROPAGATION_MANDATORY = 2; int PROPAGATION_REQUIRES_NEW = 3; int PROPAGATION_NOT_SUPPORTED = 4; int PROPAGATION_NEVER = 5; int PROPAGATION_NESTED = 6; int ISOLATION_DEFAULT = -1; int ISOLATION_READ_UNCOMMITTED = 1; int ISOLATION_READ_COMMITTED = 2; int ISOLATION_REPEATABLE_READ = 4; int ISOLATION_SERIALIZABLE = 8; int TIMEOUT_DEFAULT = -1; //获取事务传播行为 default int getPropagationBehavior() { return 0; } //获取事务的隔离级别 default int getIsolationLevel() { return -1;