一、编程式事务
Spring内置了两个对象DataSourceTransactionManager ⽤来获取事务(开启事务)、提交或
回滚事务的,⽽ TransactionDefinition 是事务的属性,在获取事务的时候需要将TransactionDefinition 传递进去从⽽获得⼀个事务 TransactionStatus,实现代码如下:
@RestController
@RequestMapping("/my")
public class UserController {
@Autowired
private UserService userService;
// JDBC 事务管理器
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
// 定义事务属性
@Autowired
private TransactionDefinition transactionDefinition;
@RequestMapping("/add")
public int add(Integer userid,String username,String password){
// 开启事务
TransactionStatus transactionStatus = dataSourceTransactionManager
.getTransaction(transactionDefinition);
// 执行事务
int result = userService.add(userid,username,password);
System.out.println("执行事务"+result);
// 提交事务
dataSourceTransactionManager.commit(transactionStatus);
// 回滚事务
// dataSourceTransactionManager.rollback(transactionStatus);
return result;
}
}
效果展示
当我们注释掉提交事务,开启回滚事务,前端发送url请求,看看后端是否插入数据库成功,以下是原始数据库的内容
发送url请求
程序执行了插入操作,但是由于事务的回滚,没有插入新数据到数据库,数据库如下
当我们注释掉回滚事务,打开提交事务,但是由于事务不能完成,也会导致事务的回滚,导致插入失败,代码如下
@RestController
@RequestMapping("/my")
public class UserController {
@Autowired
private UserService userService;
// JDBC 事务管理器
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
// 定义事务属性
@Autowired
private TransactionDefinition transactionDefinition;
@RequestMapping("/add")
public int add(Integer userid,String username,String password){
// 开启事务
TransactionStatus transactionStatus = dataSourceTransactionManager
.getTransaction(transactionDefinition);
// 执行事务
int result = userService.add(userid,username,password);
System.out.println("执行事务:"+result);
int n = 10/0; //运行失败
// 提交事务
dataSourceTransactionManager.commit(transactionStatus);
return result;
}
}
二、声明式事务
声明式事务的实现很简单,只需要在需要的⽅法上添加 @Transactional 注解就可以实现了,⽆需⼿动
开启事务和提交事务,进⼊⽅法时⾃动开启事务,⽅法执⾏完会⾃动提交事务,如果中途发⽣了没有处
理的异常会⾃动回滚事务,具体实现代码如下:
@RequestMapping("/add1")
@Transactional
public int add1(Integer userid,String username,String password){
int result = userService.add(userid,username,password);
int n = 10/0; //异常代码,导致事务失败,进行回滚
return 0;
}
@Transactional的作用范围
- 修饰方法时:只能用到public方法上,否则不生效
- 修饰类时:对该类中的所有public方法生效
@Transactional还有很多参数,有空再给大家一个一个肝吧