0 0

为什么Java程序在并发的情况下数据库会出现重复记录5

最近在开发过程中遇到的问题,不得其解,特想高手求证

笔记本比较慢,经常在开发程序的时候卡住,导致了问题的发生。

业务描述:添加用户操作。用户名为唯一数据库全局唯一。添加用户的时候先查询是否有重名,重名不允许添加。否则添加到数据库。

自己在debug的情况下,添加数据添加了保存。此时应该进入到eclipse的断点,但是由于机器比较慢,没有反应,于是在界面上连续多次点击。结果待eclipse反应过来后,程序反复调用了5次。查看数据库结果有5条同样的数据。百思不得其解。

注:数据库:mysql,spring jdbc Tempate,连接池 dbcp。数据库的用户名称为普通字段。主键自增长Id。

实际情况中也会遇到逻辑校验,但数据重复记录的情况。应该与并发有关系。请高手讲讲其中的原理。

问题补充:系统大家能够详细阐述一下原理。
2014年6月10日 20:24

5个答案 按时间排序 按投票排序

0 0

你可以加一个队列嘛

2014年6月12日 06:11
0 0

使用spring 的jdbc时,实际上是创建一条sql语句去访问数据库执行,且不说有没有唯一性校验机制(可能是代码端的查询重复记录),即使有,也可能因为并发(有先有后,但是时间间隔极短,视为同时发生),这样,并发的n条sql都可以被数据库执行并且确实被执行了,就新增了n条记录。
同楼上,解决方法无非就是程序端控制和数据库本身来控制,程序端控制可以用同步锁或者自编的线程锁,或者有避免重复提交的拦截器等等,数据库控制就是使用唯一性标识,当sql中包含唯一性主键标识时,数据库执行n条sql还是会有先后的,这样后面的语句执行就会失败。

2014年6月11日 14:25
0 0

通过数据库表的唯一索引解决,虽然不能保证判断后可以插入(并发的问题)。
但是肯定不会有重复记录

2014年6月11日 09:51
0 0

如果并发量非常小的话,线程就可以解决。

2014年6月11日 09:47
0 0

这个问题很简单:查询重复和真正的Insert并非原子操作(我说的是二者加在一起不是原则操作),因此如果两个线程在insert之前都做了同一个Key的查询,结果都是False,这时两个线程都做insert,问题就产生了:

回避的方法:
1、数据库字段设置唯一性,这样一定有一个是insert失败的;
2、程序操作加Synchronized,但是不支持集群;
3、使用分布式锁,比如Zookeeper(操作之前获取一把锁)

注意的是这里实际上是无法使用select for update的,因为数据还没有,所以也没法加锁。

2014年6月11日 09:34

相关推荐

    java web利用数据库分页

    或者在高并发场景下,防止“幻读”现象,即用户在不同时间看到相同页码但内容不同的情况。 总的来说,Java Web结合数据库实现分页是一项基础但重要的技术,它提高了用户界面的性能和可交互性。通过合理的数据库查询...

    JAVA将一个数据中数据定时自动复制(抽取)到另一个数据库

    1. **Java线程控制**:线程是Java中的基本执行单元,允许程序并发运行多个任务。在这个场景中,我们将创建一个线程来定期执行数据抽取操作。通过使用`java.lang.Thread`类或者`java.util.concurrent`包中的`...

    计算并发访问数据库的执行时间

    JDBC是Java与各种数据库进行交互的标准接口,它允许Java程序通过编写SQL语句来操作数据库。在并发环境下,JDBC提供了一种连接池(Connection Pool)机制,用于管理数据库连接,减少创建和销毁连接的开销,提高性能。...

    Java 用于学习简单的数据库中间件

    数据库中间件是连接应用程序和数据库系统的关键组件,它处理数据的存取、事务管理、并发控制等任务,使得开发者能更专注于业务逻辑而不是底层数据库操作。本项目是一个用Java实现的简单数据库中间件,虽然规模不大,...

    Java程序性能优化 让你的Java程序更快、更稳定

    Java程序性能优化是每个开发人员都需要...不断学习和实践这些技巧,你的Java程序将会在速度和稳定性上达到新的高度。通过阅读"Java程序性能优化 让你的Java程序更快、更稳定.pdf",你将获得更详尽的指导和实践案例。

    数据库连接池java代码实现

    数据库连接池在Java中的实现是提高应用程序性能的关键技术之一,它通过复用已存在的数据库连接,避免了频繁创建和销毁连接导致的系统资源浪费。本文将深入探讨如何使用Java代码来实现一个简单的数据库连接池,并解释...

    java生成流水-格式202001270001

    在这个场景中,“java生成流水-格式202001270001”指的是一个Java程序,用于生成具有特定格式的流水号,如示例所示的“202001270001”,该格式包含了日期和连续的序列号。以下将详细解释这个过程涉及的关键技术点。 ...

    java程序性能优化

    Java程序性能优化是Java开发中的重要环节,它旨在提高应用程序的运行效率,减少资源消耗,提升用户体验。在Java世界中,性能优化涵盖了多个层面,包括代码优化、内存管理、线程调度、数据库交互以及JVM参数调整等。...

    java JDBC与数据库访问学习教案.pptx

    总结:Java JDBC是Java开发人员访问数据库的关键工具,通过理解和熟练使用JDBC,开发者可以高效地构建与数据库交互的应用程序,同时理解数据库的基础知识和设计原则对于数据库应用的优化至关重要。

    基于java的数据库连接池 BoneCP.zip

    Java数据库连接池(JDBC Connection Pool)是一种管理数据库连接的技术,它允许应用程序重复使用已建立的数据库连接,而不是每次需要时都创建新的连接。这种方式提高了应用程序的性能和效率,因为建立和关闭数据库...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。...

    基于UDPjava聊天程序

    【标题】"基于UDPjava聊天程序"涉及到的核心技术是Java编程语言与用户数据报协议(UDP)的结合,用于创建一个简单的聊天应用。在Java中,UDP通信主要通过`java.net.DatagramSocket`和`java.net.DatagramPacket`类来...

    微信小程序汉堡点餐系统源码数据库论文.doc

    【系统开发工具介绍】详细介绍了微信小程序、Java语言和MYSQL数据库的基本概念和在项目中的角色。微信小程序提供了丰富的API接口,使得开发者能轻松创建交互式的前端界面;Java提供了强大的后端处理能力,支持复杂...

    Java聊天室程序(java).zip

    - **JDBC**:Java Database Connectivity允许Java程序与各种数据库进行交互,聊天室可能使用数据库存储用户信息、聊天记录等数据。 - **SQL查询**:设计合理的数据模型,并编写SQL语句进行数据的增删改查操作。 6...

    网络数据库实例源代码

    源代码中可能会包含如何开始、提交和回滚事务的示例,以及如何使用锁定机制防止脏读、不可重复读和幻读等并发问题。 错误处理和异常处理也是必不可少的部分。在与数据库交互时,可能会遇到各种问题,如连接失败、...

    Java麻将程序

    在Java中实现麻将程序,涉及到许多核心的计算机科学和软件工程概念,包括面向对象编程、算法设计、数据结构、游戏规则逻辑以及图形用户界面(GUI)的创建。 1. **面向对象编程**:Java是一种面向对象的语言,麻将...

    基于Java的Bilibili弹幕截取小程序

    总的来说,这个基于Java的Bilibili弹幕截取小程序结合了JavaFX的GUI设计、网络爬虫的数据获取、数据处理与存储、并发编程以及错误处理等多个Java核心技术,是一个很好的学习和实践Java全栈开发的案例。

    java数据库唯一id生成工具类

    *生成的ID号码可能会出现重复的情况。 *需要进行异常处理以避免程序崩溃。 Java数据库唯一ID生成工具类是一个功能强大且实用的工具类,能够生成唯一的ID号码,满足各种需要生成唯一ID号码的场景。

Global site tag (gtag.js) - Google Analytics