工作笔记(数据库乐观锁和javabean的三态)

要求:在增加时候同一个网络类型和平台下数据只能增加一条。

操作:

1.增加时候只需要在数据库中按照网络类型和平台类型查找,有的话不允许增加。

2.修改时:

​ (1)不能够直接做增加时候的判断,因为很有可能用户只修改除了以上限制条件之中的其他条件。

​ (2)不能不操作,因为很有可能修改了以上的限制条件造成重复

于是就有两种修改方式:

第一种:先入库,发现重复了就改回去

1.先按照修改id查询原来的数据

2.将新数据进行修改(修改过程中出现问题需要进行回滚,将1查出来的数据再执行修改。)

3.查询数据库,如果发现相同网络状态和平台下出现的数据数量>1,说明修改重复,进行回滚

4.回滚(1步骤查询出来的数据进行修改,再添加回到数据库)

以上方法会出现一个问题:

查询出来的bean属于持久态,会跟随数据库内这一条数据的变化而变化,(java实体类分游离态,持久态,临时态)

所以我们需要新new出来一个这样的bean接收这个查出来的bean

解决方案如下:

TIntroductConfig sql = tBuildContentService.getById(busiConsult.getId());
//sql类已经不属于游离态,会根据数据库改变,所以我们需要用一个新的类接收
TIntroductConfig t = new TIntroductConfig();
//t =sql; 这样赋值相当于给了内存地址 对象依旧处于持久态 我们需要得到持久态对象的每一个属性值
t.setContent(sql.getContent());
t.setId(sql.getId());
t.setStatus(sql.getStatus());
t.setCreateTime(sql.getCreateTime());
t.setNetworkType(sql.getNetworkType());
t.setTitle(sql.getTitle());
t.setSource(sql.getSource());


第二种:先删除,再入库

1.根据id查询数据

2.根据网络类型和平台类型查询数据(判断是否重复)

3.如果重复,回滚原来的数据

4.如果不重复,就将这条数据加入进去(加入失败会回滚)

以上方法出现问题,会触发数据库的乐观锁机制

​ 存在主键自增的每一条数据被删除后,都不能使用java代码添加和被删除数据相同id的数据,会触发乐观锁机制

解决方案如下:

​ 在进行修改的时候,把id删除(回滚数据不用),也就是把修改当作新增来处理。

busiConsult.setId(null);//将修改数据的id设置为null
tBuildContentService.uploadAndSave(busiConsult);

其实还有第三种方法。
先id取值 判断约束条件是否更改 没更改可以直接修改。
若更改了 则用限制条件查询数据 判重 若无则允许修改。
还可以用约束条件查询一个集合,判断集合长度以及判断里面是否有和被修改id相同的数据(与数据库交互一次)

猜你喜欢

转载自blog.csdn.net/qq_41371264/article/details/106899972
今日推荐