请问 多进程访问同一数据库 如何锁定

neverPE 2008-05-15 03:47:26
想进行简单的协同操作, 会存在多个进程(多台机器)访问同一数据库(服务器上). 请问有没有办法实现一下需求:
当进程A操作某一行时(不是表, 是一行), 可以将其锁定, 从而进程B无法对其进行写操作. 最好B在写操作之前, 就知道改行不能写.

我尝试用Hib的session的Lock方法对某对象进行锁定, 但不管是Write还是Read, 另一进程获得的LockMode都是None. 似乎这是Hib的锁而不是数据库的.请问各位, 这种需要要怎样实现?
...全文
104 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
burningice44 2008-05-16
  • 打赏
  • 举报
回复
不行就锁定数据库连接
neverPE 2008-05-15
  • 打赏
  • 举报
回复
我测试用的表只有一条记录. 读出来查看属性是正确的. 实在找不出是什么原因了. 难道是Access不支持对行的悲观锁?
Shine_Panda 2008-05-15
  • 打赏
  • 举报
回复
这个锁好像是数据库的,通过for update实现, 但为什么对其他进程无效呢?
可能是其他的进程并没有访问 你 for update 的那条记录 。 就不会被锁上。
neverPE 2008-05-15
  • 打赏
  • 举报
回复
谢谢楼上.

我本来也是想用悲观锁, 使用ISession的方法Lock
ISession session;
session.Lock(obj, LockMode.Upgrade)
本进程内, 再获取改对象的锁定状态session.GetCurrentLockMode(obj); 确实是LockMode.Upgrade.
但是另一个进程, 就一直是LockMode.NONE

看文档, 这个锁好像是数据库的,通过for update实现, 但为什么对其他进程无效呢?
lovingprince 2008-05-15
  • 打赏
  • 举报
回复
你要锁定一行可以使用悲观锁,即查询的时候使用 select ... for update,在一个事务中进行操作即可。

也可以使用乐观锁,即需要个版本字段,更新一次就加一,每次更新之前做对比,即可解决。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧