码迷,mamicode.com
首页 > 其他好文 > 详细

事务的应用

时间:2019-04-25 16:07:03      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:cat   pre   mapper   runtime   eof   user   用户   value   div   

我们在service中写上两个方法,一个是加钱,一个是减钱。都添加上事务。

场景A:

 1 /**
 2      * 加钱
 3      * @param userId
 4      */
 5     @Transactional
 6     public void updateAdd(Integer userId){
 7         User user_add = userMapper.findUserById(userId);
 8         BigDecimal bigDecimal = BigDecimal.valueOf(10.99);
 9         user_add.setMoney(user_add.getMoney().add(bigDecimal));
10         userMapper.update(user_add);
11     }
 1 /**
 2      * 减钱
 3      * @param userId
 4      */
 5     @Transactional
 6     public void updateLessen(Integer userId){
 7         User user_lessen = userMapper.findUserById(userId);
 8         BigDecimal bigDecimal = BigDecimal.valueOf(10.99);
 9         user_lessen.setMoney(user_lessen.getMoney().subtract(bigDecimal));
10         userMapper.update(user_lessen);
11     }

测试:

@Test
    public void test03(){
        //同时调用一个用户加钱,一个用户减钱。
        userService.updateAdd(3);
        userService.updateLessen(4);
    }

没有任何问题

下面修改一下。

场景B:

1 @Transactional
2     public void updateAdd(Integer userId){
3         User user_add = userMapper.findUserById(userId);
4         BigDecimal bigDecimal = BigDecimal.valueOf(10.99);
5         user_add.setMoney(user_add.getMoney().add(bigDecimal));
6         userMapper.update(user_add);
7         updateLessen(4);
8     }
 1 /**
 2      * 减钱
 3      * 如果当前存在事务,则挂起当前事务并且开启一个新事物继续执行,新事物执行完毕之后,
 4      * 然后在缓刑之前挂起的事务,如果当前不存在事务的话,则开启一个新事物。
 5      * @param userId
 6      */
 7     @Transactional(propagation = Propagation.REQUIRES_NEW)
 8     public void updateLessen(Integer userId){
 9         User user_lessen = userMapper.findUserById(userId);
10         BigDecimal bigDecimal = BigDecimal.valueOf(10.99);
11         user_lessen.setMoney(user_lessen.getMoney().subtract(bigDecimal));
12         userMapper.update(user_lessen);
13     }

测试:

1 @Test
2     public void test03(){
3         //同时调用一个用户加钱,一个用户减钱。
4         userService.updateAdd(3);
5         //userService.updateLessen(4);
6     }

这也没有任何问题。

下面给减钱的抛出异常:

场景C:

1  @Transactional(propagation = Propagation.REQUIRES_NEW)
2     public void updateLessen(Integer userId){
3         User user_lessen = userMapper.findUserById(userId);
4         BigDecimal bigDecimal = BigDecimal.valueOf(10.99);
5         user_lessen.setMoney(user_lessen.getMoney().subtract(bigDecimal));
6         userMapper.update(user_lessen);
7         throw new RuntimeException("此处发生异常");
8     }

结果:两个都回滚了。

可能有的小伙伴要说了,updateAdd() 抛出了异常在updateLessen() 没有进行捕获,造成了updateAdd()也是抛出了异常了的!所以他们两个都会回滚!

场景D:

 1  @Transactional
 2     public void updateAdd(Integer userId){
 3         User user_add = userMapper.findUserById(userId);
 4         BigDecimal bigDecimal = BigDecimal.valueOf(10.99);
 5         user_add.setMoney(user_add.getMoney().add(bigDecimal));
 6         userMapper.update(user_add);
 7 
 8         try {
 9             updateLessen(4);
10         } catch (RuntimeException re) {
11             re.printStackTrace();
12         }
13     }

结果:这两个事务中的数据,数据库中都进行改变了。

场景C相当于:

@Transactional
    public void updateAdd(Integer userId){
        User user_add = userMapper.findUserById(userId);
        BigDecimal bigDecimal = BigDecimal.valueOf(10.99);
        user_add.setMoney(user_add.getMoney().add(bigDecimal));
        userMapper.update(user_add);

            //updateLessen(4);
            User user_lessen = userMapper.findUserById(userId);
            user_lessen.setMoney(user_lessen.getMoney().subtract(bigDecimal));
            userMapper.update(user_lessen);
            throw new RuntimeException("此处发生异常");
        
    }

updateAdd()事务中抛出了异常。

场景D相当于:

 1 @Transactional
 2     public void updateAdd(Integer userId){
 3         User user_add = userMapper.findUserById(userId);
 4         BigDecimal bigDecimal = BigDecimal.valueOf(10.99);
 5         user_add.setMoney(user_add.getMoney().add(bigDecimal));
 6         userMapper.update(user_add);
 7 
 8         try {
 9             //updateLessen(4);
10             User user_lessen = userMapper.findUserById(userId);
11             user_lessen.setMoney(user_lessen.getMoney().subtract(bigDecimal));
12             userMapper.update(user_lessen);
13             throw new RuntimeException("此处发生异常");
14         } catch (RuntimeException re) {
15             re.printStackTrace();
16         }
17     }

updateAdd() 中抛出了异常,但是捕获了异常。




事务的应用

标签:cat   pre   mapper   runtime   eof   user   用户   value   div   

原文地址:https://www.cnblogs.com/bulrush/p/10768841.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!