论坛首页 Java企业应用论坛

多个客户端连接同一套数据,怎样防止同时更新

浏览 16061 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-12-25  
需求是这样的,多个服务器上的程序同时连接一个数据库,操作同一张表,请问怎样防止同时更新一条数据?大家有什么好的办法?
   发表时间:2012-12-26  
如果对并发响应要求不高的话,对修改的数据line 加lock,可以严格保证数据库互斥更新操作。
0 请登录后投票
   发表时间:2012-12-26  
使用悲观锁,任何在代码层面的解决方式都是无效的。因为是在不同jvm中
0 请登录后投票
   发表时间:2012-12-26  
cectsky 写道
如果对并发响应要求不高的话,对修改的数据line 加lock,可以严格保证数据库互斥更新操作。

怎么加呢?
0 请登录后投票
   发表时间:2012-12-26  
hyneng 写道
cectsky 写道
如果对并发响应要求不高的话,对修改的数据line 加lock,可以严格保证数据库互斥更新操作。

怎么加呢?


For example:
If you want to modify select name from test_table where id=100002,
you just to change it to
         "select name from test_table where id=100002 for update"

now you can update and before you commit, other client can not touch this data
0 请登录后投票
   发表时间:2012-12-26  
cectsky 写道
hyneng 写道
cectsky 写道
如果对并发响应要求不高的话,对修改的数据line 加lock,可以严格保证数据库互斥更新操作。

怎么加呢?


For example:
If you want to modify select name from test_table where id=100002,
you just to change it to
         "select name from test_table where id=100002 for update"

now you can update and before you commit, other client can not touch this data

好,我试试
0 请登录后投票
   发表时间:2012-12-26  
"select name from test_table where id=100002 for update"
不是单纯加这么一句话就行了,
我们来分析一下整个动作,
首先用户看到一张表,对应query()方法,方法里面是select ...

这一步没问题
然后就有两个分支:
1.用户点击一条记录 对应getrow()方法,对应select ... for update
  然后修改之后确认,对应update()方法,对应update ...
2.或者直接之后,select ... fro update + update ...
如果是第一种,那么两个方法必须同时持用同一个连接,且不能中断回收关闭。
第二种,达不到真正的锁定目标,因为发生在一瞬间。
0 请登录后投票
   发表时间:2012-12-26  
使用分布式锁呀
0 请登录后投票
   发表时间:2012-12-26  
读取远大于写入,请用乐观锁;
基本为写入,用悲观锁。

如果数据库资源是集中的,没有拆分,为什么要用分布式锁,好玩?
0 请登录后投票
   发表时间:2012-12-26  
Shen.Yiyang 写道
读取远大于写入,请用乐观锁;
基本为写入,用悲观锁。

如果数据库资源是集中的,没有拆分,为什么要用分布式锁,好玩?

因为是分布式的应用啊
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics