如何能在多个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(idpkauto_increment,attr1,attr2,attr3....)
id是数据库自己递增的,业务要求是:attr1,attr2....任意2条数据不能重复,--!这样是不是用唯一性索引就能解决了?
相关推荐
@server=‘LinkServer‘, --链接服务器别名。@datasrc=‘192.168.1.1‘ --要访问的的数据库所在的服务器的ip. ‘******‘ --要访问的数据库,用户的密码