首页 > 其他分享 >事务管理-cnblog

事务管理-cnblog

时间:2023-02-04 17:01:15浏览次数:40  
标签:事务管理 菜品 cnblog item address 口味 id

4). DishServiceImpl中实现方法saveWithFlavor

页面传递的菜品口味信息,仅仅包含name 和 value属性,缺少一个非常重要的属性dishId, 所以在保存完菜品的基本信息后,我们需要获取到菜品ID,然后为菜品口味对象属性dishId赋值。

具体逻辑如下:

①. 保存菜品基本信息 ;

②. 获取保存的菜品ID ;

③. 获取菜品口味列表,遍历列表,为菜品口味对象属性dishId赋值;

④. 批量保存菜品口味列表;

代码实现如下:

@Autowired
private DishFlavorService dishFlavorService;
/**
* 新增菜品,同时保存对应的口味数据
* @param dishDto
*/
@Transactional
public void saveWithFlavor(DishDto dishDto) {
    //保存菜品的基本信息到菜品表dish
    this.save(dishDto);
	
    Long dishId = dishDto.getId();//菜品id
    //菜品口味
    List<DishFlavor> flavors = dishDto.getFlavors();
    flavors = flavors.stream().map((item) -> {
        item.setDishId(dishId);
        return item;
    }).collect(Collectors.toList());

    //保存菜品口味数据到菜品口味表dish_flavor
    dishFlavorService.saveBatch(flavors);
}

说明:

​ 由于在 saveWithFlavor 方法中,进行了两次数据库的保存操作,操作了两张表,那么为了保证数据的一致性,我们需要在方法上加上注解 @Transactional来控制事务。

5). 在引导类上加注解 @EnableTransactionManagement

Service层方法上加的注解@Transactional要想生效,需要在引导类上加上注解 @EnableTransactionManagement, 开启对事务的支持。

@Slf4j
@SpringBootApplication
@ServletComponentScan
@EnableTransactionManagement //开启对事物管理的支持
public class ReggieApplication {
    public static void main(String[] args) {
        SpringApplication.run(ReggieApplication.class,args);
        log.info("项目启动成功...");
    }
}

事务管理与乐观锁冲突解决方案

  • 避免同时出现事务管理和乐观锁
  • 出现后如何解决
    • 如对一张表进行(重复的update语句),version字段会加1
      • 开启事务管理,会把这些update语句同时成功,同时失败
        • 而这里会被认为是并发操作,乐观锁生效
        • 第二次update,version不匹配
        • 所有我们在业务代码中人工将version字段+1
@Override
    @Transactional
    public void modifyDefaultAddress(Long id) {
        // 判断id的合法性
        AddressBook address = addressBookService.getById(id);
        if(address==null){
            throw new BusinessException(ErrorResult.addressFormError());
        }

        // 将当前用户的所有的收货地址is_default 设为0
        Long userId = BaseContext.getUserId();
        List<AddressBook> addressBooks = this.allAddress();

        addressBooks.forEach(item->{
            item.setIsDefault(0);
        });

        // 这里进行二次更新语句需要进行事务处理

        addressBookService.updateBatchById(addressBooks);
        // 将当前id对应的收货地址设置为1
//        AddressBook addressBook = new AddressBook();
//        addressBook.setId(id);
//        addressBook.setIsDefault(1);

        // 开启了事务管理,有开启的乐观锁,这里需要获取修改后的version
//        addressBooks.forEach(item->{
//            if(item.getId()==id){
//                address.setVersion(item.getVersion());
//            }
//        });
        address.setIsDefault(1);
        address.setVersion(address.getVersion()+1);
//        address.setDescription("test1");
        addressBookService.updateById(address);

//        LambdaQueryWrapper<AddressBook> wrapper = new LambdaQueryWrapper<>();
//        wrapper.eq()
//        List<AddressBookVo> addressBookVos = this.allAddress();

    }

标签:事务管理,菜品,cnblog,item,address,口味,id
From: https://www.cnblogs.com/lingxin1123/p/17091895.html

相关文章

  • 全局异常处理解决重复添加同一用户-cnblog
    2.6全局异常处理2.6.1思路分析要想解决上述测试中存在的问题,我们需要对程序中可能出现的异常进行捕获,通常有两种处理方式:A.在Controller方法中加入try...catch进行......
  • 过滤器实现登录拦截-cnblog
    1.3代码实现1).定义登录校验过滤器自定义一个过滤器LoginCheckFilter并实现Filter接口,在doFilter方法中完成校验的逻辑。那么接下来,我们就根据上述分析的步骤......
  • 文件上传解决方案-cnblog
    1.文件上传下载1.1上传介绍1.1.1概述文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用......
  • 不使用docker部署项目需要启动的一些服务-cnblog
    mysqlredis./redis-servenginx:./nginx源springboot项目:nohupjava-jarhelloworld-1.0-SNAPSHOT.jar&>hello.log&springboot项目部署到服务器的注意......
  • SSM复习-cnblog
    依赖注入,注入配置文件中的属性名1.2加载properties文件上节中我们已经完成两个数据源druid和C3P0的配置,但是其中包含了一些问题,我们来分析下:这两个数据源中都使用到......
  • idea配置-cnblog
    另起一行快捷键shift+enter--------->ctrl+enter设置字号17,行距1.2,字体Consolas自动导包创建一个类自动生成注释信息......
  • 服务器部署项目-cnblog
    2.项目部署之前我们讲解Linux操作系统时,就提到,我们服务端开发工程师学习Linux系统的目的就是将来我们开发的项目绝大部分情况下都需要部署在Linux系统中。那么在本章节,我......
  • 订单处理-cnblog
    4.5代码开发在OrderController中创建submit方法,处理用户下单的逻辑:/***用户下单*@paramorders*@return*/@PostMapping("/submit")publicR<String>subm......
  • vue计算属性的完整写法-cnblog
    简单写法,给计算属性赋值报错解决方案:提供set方法实例(全选-->反选,反选->全选)<template><div><span>全选:</span><!--4.v-model关联全选-选中状态......
  • vue作用域插槽-cnblog
    使用场景:父组件需要使用到子组件的data时例子父组件有list数组,传递给子组件,子组件将数组中的属性全部显示出来,但是用什么标签显示这些属性不确定(使用插槽)父组件传......