spring事务的使用注意事项

背景

最近开发中使用到了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()方法上,事务才会生效。

具体原来可以先参考上面给出的博客地址。

猜你喜欢

转载自www.cnblogs.com/shuimutong/p/13196687.html