创建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
@GeneratedValue
private int id;
@Column
private String name;
@Column
private String addr;
@UpdateTimestamp
@Column
private Date updateTime;
}

创建Repository
public interface UserRepository extends CrudRepository<User, Integer> {
@Transactional
@Modifying
int 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);
}

调用接口(预期回滚)
如下所示,数据没有变化

删除事务管理器


构建异常

调用接口(异常之前的操作被正常提交,并没有被回滚)
发现数据已经被删除,但是异常之后的添加操作并没有生效提交




















