指的是一系列的操作或步骤,这些操作要么全部完成、要么全部不完成。对于数据库而言、一系列操作数据库的SQL语句就是一个事务,这些SQL语句只能同时执行成功或失败。
事务的特性:ACID
没有事务的隔离性可能会有什么问题?
事务的隔离级别:
Spring事务的分类:
事务的操作流程:
DataSourceTransactionManager是一个Spring的事务管理器,它使用数据源来管理事务。这个事务管理器在事务开始时,会得到一个数据库连接,允许事务的创建、提交/回滚。
TransactionDefinition 用于定义事务的特性,创建一个事务。
@SpringBootTest
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Autowired
private DataSourceTransactionManager transactionManager;
@Autowired
private TransactionDefinition definition;
@Test
void addUser() {
//开启事务
TransactionStatus transactionStatus = transactionManager.getTransaction(definition);
//执行操作
int result = userMapper.addUser("mary","123",null);
System.out.println(result);
//提交事务
transactionManager.commit(transactionStatus);
//回滚事务
//transactionManager.rollback(transactionStatus);
}
}
@Transactional:
public class UserController {
@Autowired
private UserMapper userMapper;
@Transactional(rollbackFor = Exception.class)
@RequestMapping("/add")
public int addUser(String username, String password, String avatar){
if(!StringUtils.hasLength(username) || !StringUtils.hasLength(password)){
return -1;
}
int result = userMapper.addUser(username, password, avatar);
try{
//捕获可能产生的异常...
}catch (Exception e){
//手动进行回滚
log.error(e.toString());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return -2;
}
return result;
}
}
当方法对外抛出了异常,如果程序没有处理且抛出的异常和声明rollbackfor参数匹配,Spring会将这个事务标记为回滚。事务管理器最终会实现对这个事务的回滚。
@Transactional:注解的参数
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
//当存在多个事务管理器时指定使用哪一个事务管理器
@AliasFor("transactionManager")
String value() default "";
//当存在多个事务管理器时指定使用哪一个事务管理器
@AliasFor("value")
String transactionManager() default "";
String[] label() default {};
//事务的传播行为
Propagation propagation() default Propagation.REQUIRED;
//事务的隔离级别
Isolation isolation() default Isolation.DEFAULT;
//事务的超时时间,超时会自动进行回滚,默认值为-1表示没有超时时间,
int timeout() default -1;
String timeoutString() default "";
//指定事务是否为只读事务
boolean readOnly() default false;
//用于指定能够出发事务回滚的异常类型,可以指定多个异常类型
Class<? extends Throwable>[] rollbackFor() default {};
//用于指定能够出发事务回滚的异常类型,可以指定多个异常类型
String[] rollbackForClassName() default {};
//抛出指定的异常类型,不回滚事务
Class<? extends Throwable>[] noRollbackFor() default {};
//抛出指定的异常类型,不回滚事务
String[] noRollbackForClassName() default {};
}
在Spring的声明式事务中,只需要将其配置在@Transaction注解中。
主要解决一个多个事务相互调用时,事务是如何在这些方法间进行传播的以及它们之间的影响。
举一个例子:将购物车的商品支付购买
加入事务和嵌套事务:
加入事务和嵌套事务: