1.什么是事务
1.事务:事务是一组操作的集合,事务让我们的一组操作只能全部成功或者全部失败,不能存在只成功一半的情况。
2.事务的操作:
2.Spring中事务的实现
1.Spring编程式事务
springboot内置了两个对象:
1.DataSourceTransactionManager事务管理器,用来获取事务(开启事务),提交或回滚事务
@RestController
@RequestMapping("/user")
public class TController {
@Autowired
private UserService userService;
@Autowired
//事务管理器
private DataSourceTransactionManager dataSourceTransactionManager;
@Autowired
//事务定义
private TransactionDefinition transactionDefinition;
@RequestMapping("/registerUser")
public String insertUser(String userName,String password) {
//开启事务
TransactionStatus transactionStatus=dataSourceTransactionManager.getTransaction(transactionDefinition);
//执行SQL
userService.insertUser(userName,password);
//提交事务
//dataSourceTransactionManager.commit(transactionStatus);
//回滚事务
dataSourceTransactionManager.rollback(transactionStatus);
return "注册成功";
}
}
2.Spring声明式事务
引入依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
在需要执行的事务的方法上添加@Transactional注解,执行的时候如果发生异常就会自动回滚。
@RestController
@RequestMapping("/trans")
public class TransController {
@Autowired
private UserService userService;
@RequestMapping("/registerUser")
@Transactional
public String insertUser(String userName,String password) {
//执行SQL
userService.insertUser(userName,password);
//此处发生异常就会自动回滚
int a=10/0;
return "注册成功";
}
}
@Transactional作用
@Transactional可以修饰方法或类
修饰方法时:只有修饰public方法时才会生效(修饰其他方法时不会报错,也不会生效)
修饰类时:对@transactional修饰的类中所有public方法都生效
在执行方法的过程中出现异常,且异常未被捕获,就会进行事务回滚操作,但若是事务被捕获,就会认为是成功执行,依然会提交事务。
手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly手动回滚事务
@RequestMapping("/registerUser1")
@Transactional
public String insertUser1(String userName,String password) {
//执行SQL
userService.insertUser(userName,password);
//此处发生异常就会自动回滚
try {
int a=10/0;
} catch (Exception e) {
//手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return "注册成功";
}
3.@Transactional三个常见属性
1.rollback:异常回滚,指定能够触发事务回滚的异常属性,可以指定多个异常类型。
@Transactional默认只有error或者RuntimeException以下级别的异常才会发生回滚。
@RequestMapping("/registerUser2")
@Transactional(rollbackFor = {Exception.class})
public String insertUser2(String userName,String password) throws IOException {
//执行SQL
userService.insertUser(userName,password);
//此处发生异常就会自动回滚
if(true) {
throw new IOException();
}
return "注册成功";
}
2.lsolation:事务的隔离级别,默认值为Isolation.DEFAULT(连接的数据库的隔离级别)。
Spring事务隔离级别有5种:
(1)Isolation.DEFAULT:以连接数据库的事务隔离级别为主。
(2)Isolation.READ_UNCOMMITTED:读未提交,对应SQL标准中READ UNCOMMITTED
(3)Isolation.READ_COMMITTED读已提交,对应SAL标准中READ COMMITTED
(4)Isolation.REPEATABLE_READ可重复读,对应SQL标准中REPEATABLE READ
(5)Isolation.SERIALIZABLE:串行化,对应SQL标准中SERIALIZABLE
@RequestMapping("/registerUser3")
@Transactional(isolation = Isolation.READ_COMMITTED)
public String insertUser3(String userName,String password) throws IOException {
//执行SQL
userService.insertUser(userName,password);
//此处发生异常就会自动回滚
if(true) {
throw new IOException();
}
return "注册成功";
}
3.propagation:事务的传播机制,默认为Propagation.REQUIRED
多个方法存在相互调用的关系,事务是如何在这些方法中进行传播的。