spring 事务失效场景
- 场景一
如果我们save方法调用save2方法,等同于this.save2() 这样调用的话 是通过this对象 也就是UserService自己调用 这样的话 userService对象没有被spring注入,而spring的事务本身是依赖于AOP的,所以失效。
@Service
public class UserService {
public void save(){
save2();
}
@Transactional
public void save2(){
jdbcTemplate.execute("INSERT INTO user (id,name) VALUES (6,'Jack6')");
int i = 1/0;
}
}
改善场景一
通过依赖注入,让spring去创建UserService 就可以使用spring的AOP的特性 从而使事务生效。
@Service
@Slf4j
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private UserService userService;
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private TransactionTemplate transactionTemplate;
public void save(){
userService.save2();
}
@Transactional
public void save2(){
jdbcTemplate.execute("INSERT INTO user (id,name) VALUES (6,'Jack6')");
int i = 1/0;
}
}
2 场景二
方法里面有线程
public void save(){
userService.save2();
}
@Transactional
public void save2(){
jdbcTemplate.execute("INSERT INTO user (id,name) VALUES (6,'Jack6')");
new Thread(()->{
jdbcTemplate.execute("INSERT INTO user (id,name) VALUES (7,'Jack7')");
int i = 1/0;
}).start();
}
因为 事务和线程是绑定的,如果我们新开辟了一个线程,我们就会导致这个事务失效了。
3 场景三
异常被try catch包含
public void save(){
userService.save2();
}
@Transactional
public void save2(){
try {
jdbcTemplate.execute("INSERT INTO user (id,name) VALUES (6,'Jack6')");
int i = 1/0;
}catch (Exception e){
e.printStackTrace();
}
因为这样执行下来,代码是正常运行的。spring里面的事务就不会认为我们报错了。从而也就不触发事务了。