事务@transactional执行产生重复数据

背景

系统设计之初,每次来新请求,业务层会先查询数据库,判断是否存在相同的id数据(id是唯一标识产品的),有则返回当前数据库查到的数据,根据数据决定下一步动作,没有则认为是初次请求,将数据存入数据库,执行另一个操作。结果最近出现了并发情况下数据库产生了多条重复的数据。这里记录一下相关的思考与解决。

一. 查询数据库有哪些重复记录

方法1—使用group by 和 having子句

原理就是:将待查询列进行分组,并计算出每个分组中的行数,然后使用having子句筛选出大于1的分组返回结果。即为重复的数据列和重复次数。
举例子:查询表中重复的 sn 号列数据

select sn, count(*) as c from device_active_info group by sn having c>1;

结果:
在这里插入图片描述

方法2:使用子查询和 join 查询

方法1我只查询出了重复列字段和重复次数,那么我想查询重复的列对应的整行数据呢?
语法如下:(子查询和join表连接)

select t1.* from device_active_info t1 join (select sn, count(*) as c from device_active_info group by sn having c>1) t2 on t1.sn = t2.sn

结果就可以得到重复列的所有详细数据。

2. 为什么会产生重复记录?

按照常理来说,事务的ACID特性会保证事务的一致性。但是这里是因为:执行事务A的过程中,先查询 sn,不存在再执行插入;因为时间相对较长,事务A执行完操作尚未提交时,事务B也进来执行操作,当查询数据库中是否存在数据sn时,此时同样未查询到,因此两个事务都提交完毕后,就出现了两条sn相同的重复记录。

那么为什么会这样?加@Transactional 注解还不够吗?

不够。

3. 解决方法

方案1 给字段设置唯一索引或联合主键

这样,当插入重复数据时会发生异常,也就不会产生这个问题了。

举例子:我使用navicat给s字段添加unique唯一性约束。
在这里插入图片描述

方案2 使用synchronized 关键字且其作用域包含 proxy事务

这里注意我说的字眼,因为spring事务是基于AOP的,

1. Synchronized在事务注解@Transactional 标注的方法内或方法上

这种情况下锁是失效的。

@Transactional注解实现事务的功能是通过aop的方式实现的,在Synchronized锁生效之前就开启了事务,然后锁关闭,最后再提交事务,在高并发的情况下,存在同步锁关闭,但是事务还未提交,新的线程已经重新获取了同步锁,
数据库数据此时还未更新,新线程读到的数据是旧数据。导致Synchronized同步不生效问题
解决方法:
需要在事务开启之前开启同步锁。可以将Synchronized放置在调用事务函数之前。

在这里插入图片描述

2. Synchronized关键字同步的方法、代码块包含@Transactional事务

这种情况下是可以实现数据唯一的。

我们可以新建一个类,写一个synchronized方法然后内部调用要执行的事务方法。

public Synchronized void doTransaction(sn) {testService.add(sn);
}
---@Override
@transactional
public void add(String sn) {
// 有则更新或不变;无则新增插入数据库
}

MySQL 在写入数据时,可能会出现写入两条相同记录的情况,
原因如下:
重复插入:在插入数据时,如果使用的是 INSERT INTO 语句,但没有设置主键或唯一索引,那么可能会出现重复插入相同数据的情况。这时候,MySQL 不会报错,而是直接插入数据。
多线程写入:如果有多个线程同时写入相同的数据,那么就可能会出现写入两条相同的记录的情况。这种情况下,需要使用事务来保证数据的一致性。
主从同步:在主从复制的环境下,如果主库写入了一条数据,但是还没有同步到从库,而此时主库又写入了一条相同的数据,那么就会出现写入两条相同的记录的情况。
为了避免写入两条相同的记录,可以采取以下措施:
设置主键或唯一索引,避免重复插入相同的数据。
使用事务来保证数据的一致性,避免多线程同时写入相同的数据。
在主从复制的环境下,可以采用延迟复制或者增加从库的数量来提高同步速度,避免写入两条相同的记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/22699.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python+pytest接口自动化之测试函数、测试类/测试方法的封装

目录 前言 测试用例封装的一般规则 测试函数的封装 测试类/方法的封装 示例代码 总结 前言 在pythonpytest 接口自动化系列中,我们之前的文章基本都没有将代码进行封装,但实际编写自动化测试脚本中,我们都需要将测试代码进行封装&#…

C# Winfrom将DataGridView数据导入Excel

1.项目添加Word和Excel的COM类型库引用 2.创建Excel工作表 //定义Excel操作对象Microsoft.Office.Interop.Excel.Application excelApp new Microsoft.Office.Interop.Excel.Application();//定义Excel工作表Microsoft.Office.Interop.Excel.Worksheet worksheet excelApp.Wo…

“管理Layui树形图,提高页面交互性与可视化效果“

标题:管理Layui树形图,提高页面交互性与可视化效果 Layui树形图简介一、引入Layui和jQuery库:二、HTML结构准备:三、初始化树形图:四、配置树形图的其他属性和事件:4.1 实体类4.2 PermissionDao方法4.3 Per…

20230714----重返学习-DOM-diff算法-构建工具-包管理工具-Vite基本使用-Vue3新特性

day-112-one-hundred-and-twelve-20230714-DOM-diff算法-构建工具-包管理工具-Vite基本使用-Vue3新特性 DOM-diff算法 vue2中diff算法 同级比对,跨级比对性能差。而且采用的方式是递归比对,更差一点。根节点只能有一个,比对的时候会从根节…

【Unity面试篇】Unity 面试题总结甄选 |Unity基础篇 | ❤️持续更新❤️

2.2 前言 关于Unity面试题相关的所有知识点:🐱‍🏍2023年Unity面试题大全,共十万字面试题总结【收藏一篇足够面试,持续更新】为了方便大家可以重点复习某个模块,所以将各方面的知识点进行了拆分并更新整理…

Jenkins全栈体系(二)

Jenkins 第三章 Jenkins Git Maven 自动化部署配置 十、几种构建方式 快照依赖构建/Build whenever a SNAPSHOT dependency is built 当依赖的快照被构建时执行本job 触发远程构建 (例如,使用脚本) 远程调用本job的restapi时执行本job job依赖构建/Build after other proj…

matlab学习指南(2):安装工具箱Toolbox的方法(详细图解)

🌅*🔹** φ(゜▽゜*)♪ **🔹*🌅 欢迎来到馒头侠的博客,该类目主要讲数学建模的知识,大家一起学习,联系最后的横幅! 喜欢的朋友可以关注下,私信下次更新不迷路&#xff0…

青岛大学_王卓老师【数据结构与算法】Week05_12_队列的类型定义_学习笔记

本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础…

Elasticsearch 倒排索引原理

看下面这个表格里的文档内容: 如果我这时候想要在这么多文档中查找带有 比亚迪 的我要怎么查,传统这个查询里面我想查这个比亚迪的话。就是先在文档1里面搜索一下有没有 比亚迪,没有,我在到文档2中查找比亚迪,还是没有…

多态的基本使用

这部分的内容主要是记住使用方法,原理在之后会讲。 多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 比如说买票,普通人买票就是正常买&…

Low-Light Image Enhancement via Self-Reinforced Retinex Projection Model 论文阅读笔记

这是马龙博士2022年在TMM期刊发表的基于改进的retinex方法去做暗图增强(非深度学习)的一篇论文 文章用一张图展示了其动机,第一行是估计的亮度层,第二列是通常的retinex方法会对估计的亮度层进行RTV约束优化,从而产生…

OPPO手机便签怎么上传录音文件?

相信很多网友对OPPO这个手机品牌并不陌生,因为它凭借时尚轻薄的外观设计、流畅简约的系统、清晰的拍照摄影以及高中低不同的价位选择,赢得了不少年轻消费者的青睐。不过在使用OPPO手机的过程中,也有不少用户表示自己遇到了各种各样的问题&…