今天在同事碰到了一个比较有意思的问题,为了实现某个场景中的数据更新和删除,想通过 delete all entities 然后 insert new entities 的方式减少判断数据是否删除的操作,结果由于表内有其他唯一索引报错唯一键冲突。
后面在 debug 的过程中,用 evaluate 查询数据确实不在,但是 insert 的时候会报唯一键冲突导致插入失败事务回滚。

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [unique_format_content_language] ...
  • 下面大概复现下问题
    mysql 版本 5.x.x 事务隔离级别 read commit
public class User {private Long id; // primary keyprivate Long uk; // foreign keyprivate String className; // keyprivate String name;private int age;}

大概通过下面的方式进行先删除,再插入。这里通过班级名称来统一删除相关用户,再插入传进来的最新版本。

@Transactionalpublic boolean update(List<User> users, String className) {userRepository.deleteByClassName(className);userRepository.insertBatch(users);return true;}

这里由于通过 className 这个普通索引进行删除,在事务中仅对这些数据做了标记,并没有真正从磁盘中删除。并且也没有对唯一索引进行更新,从而导致后面插入新版本数据的过程中,如果是修改的数据那么会在唯一索引找到重复的键从而导致冲突。
这里的解决方法是可以通过 pk 或者 uk 进行删除,这样会去更新索引,从而避免冲突。

todo:事务中索引的变更

当然这里也可以将班级的其他人查出来,然后通过比较找到 insertList、updateList 以及 deleteList。

spring 事务中先删除再插入后唯一键冲突 delete then insert duplicate key相关推荐

  1. spring事务中的超时时间很多人都不理解

    在spring中如何使用事务是一个很大的问题,其中有一个我需要在这篇文章中着重讲解一下,就是spring事务中的超时时间问题,很多同学不知道如何才能是这个超时时间生效,导致在使用过程中出现各种各样的问 ...

  2. oracle中执行某sql语句后,如一系列delete、update等操作,怎么看影响的行数?如我执行了n个表的delete语句,得看我删除了多少数据,万一sql写的有问题,误删了数据,不是灾难?

    oracle中执行某sql语句后,如一系列delete.update等操作,怎么看影响的行数?如我执行了n个表的delete语句,得看我删除了多少数据,万一sql写的有问题,误删了数据,不是灾难? 使 ...

  3. mysql事务保证幂等_使用数据库唯一键实现事务幂等性

    幂等性 概念 在分布式系统中,幂等性是一致性方面的一个重要概念.幂等(idempotent.idempotence)是一个数学与计算机学概念,常见于抽象代数中. 在编程中一个幂等操作的特点是其任意多次 ...

  4. java 锁表后事务提交_关于synchronized锁在Spring事务中进行数据更新同步,仍出现线程安全问题...

    #1 问题描述# 最近有小伙伴在做商品抽奖活动时,在对奖品库存进行扣减,有线程安全的问题,遂加锁synchronized进行同步,但发现加锁后并没有控制住库存线程安全的问题,导致库存仍被超发. 先简单 ...

  5. 关于synchronized锁在Spring事务中进行数据更新同步,仍出现线程安全问题

    为什么80%的码农都做不了架构师?>>>    #1 问题描述# 最近有小伙伴在做商品抽奖活动时,在对奖品库存进行扣减,有线程安全的问题,遂加锁synchronized进行同步,但发 ...

  6. Oracle 数据库表中已有重复数据添加唯一键(唯一约束)

    问题描述 以 demo 举例,模拟真实场景. 表 TEST_TABLE 有如下字段和数据:id 是主键,code 没有设置键和索引 ID CODE 1 code1 2 code2 3 code2 4 ...

  7. Spring AOP中的前置通知和后置通知详解

    不同版本的spring对AOP的支持有所不同,spring2.0之前,它主要针对不同类型的拦截器使用XML配置文件通过代理来实现.而spring2.0之后,它可以使用JDK5的注解来完成AOP的实现, ...

  8. 模板方法在Spring事务中的应用

    事务对于我们来讲不并陌生,也是在实际应用中一直都在使用.在JDBC中,事务大致的使用结构如下: 开启事务 业务逻辑处理 提交事务 Spring只是对事务进行了扩展和封装使用,现在看看在内部它是如何工作 ...

  9. Spring 如何在一个事务中开启另一个事务?

    Spring项目,需要在一个事务中开启另一个事务. 上面提到的情景可能不常见,但是还是会有的,一旦遇到,如果业务比较复杂,就会很麻烦,但是还是有解决的方案的,比如将一个service方法拆成两个方法, ...

最新文章

  1. HDU 2896 病毒侵袭 AC自动机
  2. C#多线程编程(6)--线程安全2 互锁构造Interlocked
  3. error C3861: “setw”: 找不到标识符
  4. Android Bitmap面面观
  5. Toping Kagglers:Bestfitting,目前世界排名第一
  6. python顺序执行 toggle_编写脚本在Python中运行多个脚本
  7. 2021“MINIEYE杯”中国大学生算法设计超级联赛(10)Pty loves string(Border+二维数点)
  8. 12 | 排序(下):如何用快排思想在O(n)内查找第K大元素?
  9. php.ini开启命名空间,Zend Framework教程之模型Model基本规则和使用方法
  10. use 在php 用法中的总结
  11. 升级到Oracle 19c:你不可不知的十大SQL问题(上)
  12. 【转】:TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute
  13. python实现网站测速软件_python实现网站友情链接查询与网站死链接查询的两个脚步...
  14. 订阅号获取openid_小程序订阅消息
  15. Struts2标签库(三)之表单标签
  16. 应急响应-Linux入侵排查
  17. 差分进化算法求解函数最优解matlab实现
  18. PS制作精美QQ流光头像详细教程
  19. 美丽苏大,清华博士,年轻硕导,招收研究生了!
  20. 基于WxPusher给自己的个人微信发送提醒消息(二)

热门文章

  1. mysql read rnd next_MySQL rnd_next_编程学问网
  2. SpringCache源码学习笔记
  3. c语言read怎么一行一行读,使用read从标准输入中读取一行
  4. 使用ffmpeg批量转码的命令行(以mkv转mp4为例)
  5. bzoj1412: [ZJOI2009]狼和羊的故事(最小割)
  6. nginx编译报错 cc1:所有的警告都被当作是错误 make[1]:*** [objs/Makefile:446:objs/src/core/nginx
  7. 日本大阪强制公务员下班,每天18点半电脑自动关机…这能行?!
  8. 装配式成品支架技术要求解读
  9. 【毅力挑战】PCIe 每日一问一答(2022.12 已归档)
  10. ZK可视化神器prettyZoo玩耍