一、事务类型
- 编程式事务:
a. 通过编写代码来管理事务的开启、提交和回滚。
b. 适用于需要高度定制化控制事务行为的场景。
c. 通常使用 TransactionTemplate 或 PlatformTransactionManager 进行管理。
- 声明式事务:
a. 通过配置和注解来声明事务,开发者无需编写管理事务的代码。
b. 更简洁,适合大多数常见的事务管理场景。
c. 主要使用 @Transactional 注解来定义事务边界和属性。
二、事务传递
spring事务传递:
在 Java 中,事务传递是指在多个事务嵌套执行的过程中,事务如何传递和处理。当一个方法调用另外一个方法时,如果这些方法都使用了事务,那么这些事务可能会被合并为一个大的事务,也可能会出现不同的嵌套级别
Spring中默认的事务传递行为是required,如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务。
这是 Spring 中的事务传播行为类型,用于控制在一个事务方法调用另一个事务方法时,事务应该如何传播。
- PROPAGATION_SUPPORTS:如果当前有事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
- PROPAGATION_MANDATORY:必须存在一个当前的事务,否则抛出异常。
- PROPAGATION_REQUIRES_NEW:新建一个全新的事务,并且暂停当前事务,直到新建的事务完成。
- PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则挂起该事务。
三、隔离级别
- 读未提交(READ-UNCOMMITTED):允许读取未提交的数据,存在脏读、不可重复读、幻读等问题。
- 读已提交(READ-COMMITTED ):只能读取已提交的数据,可以避免脏读,但仍可能存在不可重复读和幻读问题。
- 可重复读(REPEATABLE-READ):保证同一个事务中多次读取同一数据的结果是一致的,可以避免脏读和不可重复读,但仍可能存在幻读问题。
- 串行化(SERIALIZABLE):最高的隔离级别,保证并发执行的事务之间不会产生任何影响,可以避免脏读、不可重复读和幻读问题。