背景
最近开发中使用到了spring的注解事务,之前听说过有坑,但是没有仔细研究过。现在工作中用到了,总感觉用的不踏实,所以试验试验。
一、基础
关于什么try-catch的使用,这里我就不赘述了,感兴趣的可以先参考(https://www.cnblogs.com/nhdlb/p/12120629.html)这篇文章,虽然我也没细看。
二、事务是否能够生效
主要参考:http://www.manongjc.com/article/56493.html
感觉这类博客描述的看着不好懂,所以我这里直接上代码了。
1 package com.shuimutong.learn.basestart.service.impl; 2 3 import com.alibaba.fastjson.JSON; 4 import com.shuimutong.learn.basestart.dao.UserRepository; 5 import com.shuimutong.learn.basestart.domain.User; 6 import com.shuimutong.learn.basestart.service.UserService; 7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.jdbc.core.JdbcTemplate; 9 import org.springframework.stereotype.Component; 10 import org.springframework.transaction.annotation.Transactional; 11 12 import java.util.List; 13 import java.util.Optional; 14 import java.util.Random; 15 16 @Component 17 public class UserServiceImpl implements UserService { 18 @Autowired 19 private JdbcTemplate jdbcTemplate; 20 @Autowired 21 private UserRepository userRepository; 22 23 int num = 1; 24 25 @Override 26 public User update(long id) { 27 System.out.println("update---,id:" + id); 28 Optional<User> userOpt = userRepository.findById(id); 29 User user = userOpt.get(); 30 System.out.println("更新前,user" + JSON.toJSONString(user)); 31 try { 32 realUpdaate(user); 33 System.out.println("无异常---"); 34 } catch (Exception e) { 35 System.out.println("有异常***"); 36 throw e; 37 } 38 userOpt = userRepository.findById(id); 39 user = userOpt.get(); 40 System.out.println("更新后,user" + JSON.toJSONString(user)); 41 return user; 42 } 43 44 @Transactional 45 public void realUpdaate(User user) { 46 num++; 47 System.out.println("num:" + num); 48 user.setAge(num); 49 userRepository.save(user); 50 if(num % 2 == 0) { 51 throw new RuntimeException("testTrans"); 52 } 53 } 54 }
如果service代码像上面这样写,controller代码像下面这样:
public class UserController { @Autowired private UserRepository userRepository; @GetMapping(path="update") @ResponseBody public User update(@RequestParam long userId) { User user = userService.update(userId); return user; } }
那么注解在realUpdaate上面的事务是不会生效的。
…………………………………………………………………………………………………………
需要把事务注解放在update()方法上,事务才会生效。
具体原来可以先参考上面给出的博客地址。