场景 A:
- /**
- * 加钱
- * @param userId
- */
- @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);
- }
- /**
- * 减钱
- * @param userId
- */
- @Transactional
- public void updateLessen(Integer userId){
- User user_lessen = userMapper.findUserById(userId);
- BigDecimal bigDecimal = BigDecimal.valueOf(10.99);
- user_lessen.setMoney(user_lessen.getMoney().subtract(bigDecimal));
- userMapper.update(user_lessen);
- }
测试:
- @Test
- public void test03(){
- // 同时调用一个用户加钱, 一个用户减钱.
- userService.updateAdd(3);
- userService.updateLessen(4);
- }
没有任何问题
下面修改一下.
场景 B:
- @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);
- }
- /**
- * 减钱
- * 如果当前存在事务, 则挂起当前事务并且开启一个新事物继续执行, 新事物执行完毕之后,
- * 然后在缓刑之前挂起的事务, 如果当前不存在事务的话, 则开启一个新事物.
- * @param userId
- */
- @Transactional(propagation = Propagation.REQUIRES_NEW)
- public void updateLessen(Integer userId){
- User user_lessen = userMapper.findUserById(userId);
- BigDecimal bigDecimal = BigDecimal.valueOf(10.99);
- user_lessen.setMoney(user_lessen.getMoney().subtract(bigDecimal));
- userMapper.update(user_lessen);
- }
测试:
- @Test
- public void test03(){
- // 同时调用一个用户加钱, 一个用户减钱.
- userService.updateAdd(3);
- //userService.updateLessen(4);
- }
这也没有任何问题.
下面给减钱的抛出异常:
场景 C:
- @Transactional(propagation = Propagation.REQUIRES_NEW)
- public void updateLessen(Integer userId){
- User user_lessen = userMapper.findUserById(userId);
- BigDecimal bigDecimal = BigDecimal.valueOf(10.99);
- user_lessen.setMoney(user_lessen.getMoney().subtract(bigDecimal));
- userMapper.update(user_lessen);
- throw new RuntimeException("此处发生异常");
- }
结果: 两个都回滚了.
可能有的小伙伴要说了, updateAdd() 抛出了异常在 updateLessen() 没有进行捕获, 造成了 updateAdd() 也是抛出了异常了的! 所以他们两个都会回滚!
场景 D:
- @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);
- try {
- updateLessen(4);
- } catch (RuntimeException re) {
- re.printStackTrace();
- }
- }
结果: 这两个事务中的数据, 数据库中都进行改变了.
场景 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 相当于:
- @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);
- try {
- //updateLessen(4);
- User user_lessen = userMapper.findUserById(userId);
- user_lessen.setMoney(user_lessen.getMoney().subtract(bigDecimal));
- userMapper.update(user_lessen);
- throw new RuntimeException("此处发生异常");
- } catch (RuntimeException re) {
- re.printStackTrace();
- }
- }
updateAdd() 中抛出了异常, 但是捕获了异常.
事务的应用
来源: http://www.bubuko.com/infodetail-3035407.html