数据库表非重复字段和锁的问题

J2EE 码拜 10年前 (2015-07-18) 1140次浏览 0个评论
 

表里有个非主键,但业务上不能重复字段,在新增一条记录时,目前的做法是先根据这个字段select一下,如果有值就返回错误消息,如果没有值就插入一条(这里先假定插入时主键不会重复)。
但我觉得有没有可能有这样的问题,就是两笔操作同时进行,在select的时候都发现当前没有该字段,然后一起插入,这样就会有问题的,我想问像这类问题,一般是数据库里把这个字段设置成非重复比较好,还是程序里手工判断比较好?
如果手工判断的话,有没有什么思路可以参考下?比如在select前就要加个锁什么的?

#1

唯一键约束
参考http://bbs.csdn.net/topics/350087351

#2

回复1楼:

设置成unique我知道的,如果我不想改数据库的设置,希望通过前台判断呢?

#3

回复2楼:

说错,不是前台,一般是后台判断,不过问题如我之前描述。

#4

同时操作且字段重复的概率是非常小的吧
20分

#5

这个一般在数据库解决是最保险的,由程序控制会有各种漏洞
for update 因为这是插入,所以select for update不好解决,除非你锁整张表,否则你是阻止不了另外的线程插入新的数据,且当前线程
查询不到这条数据。

java锁:应用在非集群的情况下,用java的锁来解决这个问题
在集群环境就不好弄了,要用分布式锁

我遇到这个问题的一般解决方案是在前端,在插入前先做一个判断,这里主要是为了体验
然后后端交给数据库做最后一道判断,这里如果出现重复,会抛错

#6

回复5楼:

java锁:应用在非集群的情况下,用java的锁来解决这个问题
在集群环境就不好弄了,要用分布式锁
这一段不大明白,什么是java锁和集群环境?

我现在也觉得数据库设置唯一比较保险,逻辑控制的话除非全锁,不然怎么都会有漏洞,而且判断太多的话还降低效率。

#7

回复6楼:

java有同步锁,这样所有竞争的请求就会是排队
但是java的同步锁,使用范围是同一个jvm,如果你的应用是集群环境,也就是存在多个jvm进程
这样锁就没有意义了,需要用分布式锁。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明数据库表非重复字段和锁的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!