
Spring中的事务操作分为两类:
Spring 手动操作事务和 MySQL 操作事务类似,有三个重要操作步骤:
SpringBoot 内置了两个对象:
DataSourceTransactionManager:事务管理器,用来获取事务(开启事务),提交或回滚事务的TransactionDefinition:事务的属性,在获取事务的时候需要将 TransactionDefinition 传递进去从而获得一个事务 TransactionStatus代码实现:
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/user")
@RestController
public class UserController {
// 注入事务管理器
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
// 注入事务属性
@Autowired
private TransactionDefinition transactionDefinition;
@Autowired
private UserService userService;
@RequestMapping("/registry")
public String registry(String name,String password){
// 开启事务
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
// 用户注册
userService.registryUser(name,password);
// 提交事务
dataSourceTransactionManager.commit(transactionStatus);
// 回滚事务
//dataSourceTransactionManager.rollback(transactionStatus);
return "注册成功";
}
}@Transactional<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>2. 在需要事务的方法上添加 @Transactional 注解就可以实现了。无需手动开启事务和提交事务,进入方法时自动开启事务,方法执行完会自动提交事务,如果中途发生了没有处理的异常会自动回滚事务。
@RequestMapping("/trans")
@RestController
public class TransactionalController {
@Autowired
private UserService userService;
@Transactional
@RequestMapping("/registry")
public String registry(String name,String password){
// 用户注册
userService.registryUser(name,password);
return "注册成功";
}
}public 方法时才生效(修饰其他方法时不会报错,也不生效)[推荐]@Transactional 修饰的类中所有的 public 方法都生效。💥注意事项:
下面对异常进行捕获:
@Transactional
@RequestMapping("/registry")
public String registry(String name,String password){
userService.registryUser(name,password); // 模拟用户注册功能
log.info("用户数据插入成功");
// 对异常进行捕获
try {
// 强制程序抛出异常
int a = 10/0;
}catch (Exception e){
e.printStackTrace();
}
return "注册成功";
}运行程序,发现虽然程序出错了,但是由于异常被捕获了,所以事务依然得到了提交。
如果需要事务进行回滚,有以下两种方式:
@Transactional
@RequestMapping("/registry")
public String registry(String name,String password){
userService.registryUser(name,password);
log.info("用户数据插入成功");
// 对异常进行捕获
try {
int a = 10/0;
}catch (Exception e){
// 将异常重新抛出去
throw e;
}
return "注册成功";
}2. 手动回滚事务:使用 TransactionAspectSupport.currentTransactionStatus() 得到当前的事务,并使用 setRollbackOnly 设置回滚。
@Transactional
@RequestMapping("/registry")
public String registry(String name,String password){
userService.registryUser(name,password);
log.info("用户数据插入成功");
// 对异常进行捕获
try {
int a = 10/0;
}catch (Exception e){
// 手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return "注册成功";
}原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。