该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-08
最后修改:2009-08-10
公司的做法是: 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条数据不能重复, - -!这样是不是用唯一性索引就能解决了? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-08
把save交给一台机器处理,然后暴露API给其他机器使用
|
|
返回顶楼 | |
发表时间:2009-08-08
最后修改:2009-08-08
可以在数据库里面建一个版本行。。。
如果提交a或者b就更新版本行 |
|
返回顶楼 | |
发表时间:2009-08-08
rain2005 写道 可以在数据库里面建一个版本行。。。
如果提交a或者b就更新版本行 建版本好像不能解决问题啊,不管有没版本,都要先查询数据库有没有记录才能决定是插入还是不插入(或者更新),但是这个2个动作之间要是被人抢先插入,就会出问题 |
|
返回顶楼 | |
发表时间:2009-08-09
This is a read-write lock problem.
when someone is writing the DB, other people should wait. In java the sychronized key word has the function of similar read-write lock. I think the codes are proper under common situation. |
|
返回顶楼 | |
发表时间:2009-08-09
by5739 写道 rain2005 写道 可以在数据库里面建一个版本行。。。
如果提交a或者b就更新版本行 建版本好像不能解决问题啊,不管有没版本,都要先查询数据库有没有记录才能决定是插入还是不插入(或者更新),但是这个2个动作之间要是被人抢先插入,就会出问题 所以说才加个版本行啊,提交是看版本有没有变化撒,如果版本行版本发生变化就会滚事务,不是很easy的事么? |
|
返回顶楼 | |
发表时间:2009-08-09
by5739 写道 rain2005 写道 可以在数据库里面建一个版本行。。。
如果提交a或者b就更新版本行 建版本好像不能解决问题啊,不管有没版本,都要先查询数据库有没有记录才能决定是插入还是不插入(或者更新),但是这个2个动作之间要是被人抢先插入,就会出问题 所以说才加个版本行啊,提交是看版本有没有变化撒,如果版本行版本发生变化就会滚事务,不是很easy的事么? |
|
返回顶楼 | |
发表时间:2009-08-09
如果是1个DB,那么唯一的事务数据库自己会处理的,需要你在程序中做判断么?纯粹属于不了解数据库
|
|
返回顶楼 | |
发表时间:2009-08-09
rain2005 写道 by5739 写道 rain2005 写道 可以在数据库里面建一个版本行。。。
如果提交a或者b就更新版本行 建版本好像不能解决问题啊,不管有没版本,都要先查询数据库有没有记录才能决定是插入还是不插入(或者更新),但是这个2个动作之间要是被人抢先插入,就会出问题 所以说才加个版本行啊,提交是看版本有没有变化撒,如果版本行版本发生变化就会滚事务,不是很easy的事么? 不太明白啊。。。比如顺序是这样的: a服务器检查DB发现没有数据 b服务器检查DB发现没有数据 b服务器插入版本为1,id=1的数据 a服务器插入版本为1,id=2的数据 id是db自动生成,这样好像不能控制数据唯一吧? |
|
返回顶楼 | |
发表时间:2009-08-09
attr1和attr2做成主键,这样让数据库帮你检查。
|
|
返回顶楼 | |