lIIl 2009-08-19 21:02
浏览 535
已采纳

如何能在多个web服务器1个DB的情况下保证数据唯一?

公司里做的项目, 打算用多个web服务器, 共同连一个DB, 在某个基础表里的数据需要逻辑唯一, 既某对象(attr1="a", attr2="b")在数据库里只能存在一条记录, 由于这个基础表在用户使用中是用户自定义的, 因此有可能a,b2个用户通过web服务器a和web服务器b同时提交对象(attr1="a", attr2="b")...那么在这种情况下如何使DB里面最终只有一条记录?

公司的做法是:


public synchronized A save(A a){
//查找数据库看有没有a
if(没有记录){
//锁表
    //插入记录
}else{
    //返回数据库记录
} 

}



但我觉得这样还是有问题啊, 因为在查数据库完了之后, 有可能另一台服务器正在保存了, 不过他们解释如果另一台服务器如果正在保存, 这边这台锁表不会成功的, 请问一下, 大家遇到这种情况是怎么处理的?

=================================
也许是我没说清楚, 后面有个同学说得对, 说白了就是多服务器下并发插入的问题, 如何能做到并发插入时保证数据唯一
下面是大家的一些方案(排名不分先后 ), 看看还有没有其他的方案:
1. 把save交给一台机器处理,然后暴露API给其他机器使用
2. 乐观锁(这个我觉得似乎不能解决并发插入问题啊)
3. 联合主键
4. 唯一索引
5. 直接往数据库里面插数据,加个时间字段,精确到毫秒级就差不多了,取最新的那个时间字段的行
6. 做一个数据库操作锁,方法调用前都要取锁,取到锁的才用执行,否则等待,这个锁可以放在缓存服务器中,集群中的所有节点连上这台缓存服务器

===============================
加说一下: 这个表是有pk的..比如表结构是:A(id pk auto_increment, attr1, attr2, attr3....)
id是数据库自己递增的, 业务要求是:attr1, attr2....任意2条数据不能重复, - -!这样是不是用唯一性索引就能解决了?
问题补充
rain2005 写道
可以在数据库里面建一个版本行。。。
如果提交a或者b就更新版本行

建版本好像不能解决问题啊,不管有没版本,都要先查询数据库有没有记录才能决定是插入还是不插入(或者更新),但是这个2个动作之间要是被人抢先插入,就会出问题

问题补充
rain2005 写道
by5739 写道
rain2005 写道
可以在数据库里面建一个版本行。。。
如果提交a或者b就更新版本行

建版本好像不能解决问题啊,不管有没版本,都要先查询数据库有没有记录才能决定是插入还是不插入(或者更新),但是这个2个动作之间要是被人抢先插入,就会出问题


所以说才加个版本行啊,提交是看版本有没有变化撒,如果版本行版本发生变化就会滚事务,不是很easy的事么?


不太明白啊。。。比如顺序是这样的:
a服务器检查DB发现没有数据
b服务器检查DB发现没有数据
b服务器插入版本为1,id=1的数据
a服务器插入版本为1,id=2的数据

id是db自动生成,这样好像不能控制数据唯一吧?

问题补充
dmewy 写道
PK是干嘛的?

如果pk是DB自动生成的...估计也不行吧?
问题补充
pipilu 写道
你那是跨进程的东西,加上sychronized有用么?服务器A上的实例跟服务器B上的实例互斥?

不是, 那个是防止2个用户在同一台web服务器新增同样的数据用的
问题补充
nwangwei 写道
1.针对这两个字段做唯一索引;
2.然后web服务器上直接插入,抓特定的Exception判断是不是违反了唯一性。

这个...我看行...

问题补充
lixjluck 写道
treblesoftware 写道
zelsa 写道
把save交给一台机器处理,然后暴露API给其他机器使用


如果这样子,是不是有些浪费了,而且SAVA请求过多,是不是会网络堵塞,有更好的解决方案吗。

交给一台机器也有并发的问题吧

是否考虑使用MQ的queue,所有的web发送到mq上,有一个消费者消费这些数据

这种方式有几个问题:
1、异步,不知业务允许
2、消费稍微有些慢


ps. 为什么是会员设置的数据,但是这个表有不和userId有关联。


这个是基础业务数据, 是使用者自己录入然后在上面做业务的, 是大家共享的基础数据, 所以不和userid挂钩
问题补充
对的, 我现在只会1web服务器1db的情况, 我很想学构架方面, 但是没找到合适的书籍, 上面兄弟有没有好的架构方面的书籍推荐? 不胜感激.....
  • 写回答

47条回答 默认 最新

  • yangwlqi 2009-08-19 21:02
    关注

    唯一索引。。。。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(46条)

报告相同问题?

悬赏问题

  • ¥15 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,
  • ¥15 spaceclaim模型变灰色
  • ¥15 求一份华为esight平台V300R009C00SPC200这个型号的api接口文档
  • ¥15 字符串比较代码的漏洞
  • ¥15 欧拉系统opt目录空间使用100%
  • ¥15 ul做导航栏格式不对怎么改?