创建springboot项目
搭建最简单的SpringBoot项目_Steven-Russell的博客-CSDN博客
引入jpa和数据据依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version> </dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version><scope>provided</scope> </dependency>
创建实体类
@Data @Entity @Table(name = "tbl_user") public class User {@Id@Column@GeneratedValueprivate int id;@Columnprivate String name;@Columnprivate String addr;@UpdateTimestamp@Columnprivate Date updateTime; }
创建Repository
public interface UserRepository extends CrudRepository<User, Integer> {@Transactional@Modifyingint deleteAllByNameIn(@Param(value = "nameList") List<String> nameList); }
创建controller 并且注入 事务管理器和Repository
注意:需要注入 PlatformTransactionManager
创建数据
构建异常
@GetMapping(value = "transactional") public String transactionalUser() {DefaultTransactionDefinition transDefinition = new DefaultTransactionDefinition();transDefinition.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW);TransactionStatus transStatus = transactionManager.getTransaction(transDefinition);try {deleteUser4Transactional();addUser4Transactional();transactionManager.commit(transStatus);} catch (Exception e) {e.printStackTrace();transactionManager.rollback(transStatus);}return "success"; }private void addUser4Transactional() {int i = 1;int ans = i/0;User user = new User();user.setName("addUser4TransactionalName");user.setAddr("chongqing");userRepository.save(user); }private void deleteUser4Transactional() {List<String> nameList = new ArrayList<String>(){{add("aaa");add("ccc");}};int ans = userRepository.deleteAllByNameIn(nameList);System.out.println("deleteUser4Transactional ans : " + ans); }
调用接口(预期回滚)
如下所示,数据没有变化
删除事务管理器
构建异常
调用接口(异常之前的操作被正常提交,并没有被回滚)
发现数据已经被删除,但是异常之后的添加操作并没有生效提交