有关多进程访问数据库的互斥问题。

resicler 2002-07-11 07:57:17
在取数据号码时,甲进程从数据库中检索出某一号码为可用后(即状态为空闲),但还没有占用(即修改状态为占用)前,乙进程做了同样的操作(也从数据库中检索出该号码),此后进程甲将该号码的状态改为占用,但对于进程乙来说,他并不知道该号码状态已经为别人改掉,于是导致了两个进程得出了相同的号码,并且均返回成功。(实际上返回成功的条件是原来号码状态为空闲,后来将状态改为占用)运行多个进程的目的是为了提高速度。期待高手指教,分不够可以再加。

数据表单定义如下:
HMHM VARCHAR2(9) (号码)
HMJT NUMBER(4) Y
HMLX VARCHAR2(6) Y
HMFJ NUMBER(4) Y
HMFB VARCHAR2(6) Y
HMZT VARCHAR2(6) Y (状态 000:空闲001:占用)
HMRQ VARCHAR2(8) Y
HMSJ VARCHAR2(6) Y
...全文
324 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingkl 2002-07-15
  • 打赏
  • 举报
回复
CRecordSet类可以使用SetLockingMode设置在Edit加锁,然后检验值、修改、最后Update


RodgerLiang 2002-07-15
  • 打赏
  • 举报
回复
To Q仔:
在ORACLE中不会自动把行级锁变成表级锁,除非你自己设定。
To 大强子:
Access 不支持 TRANSACTION。
To dingkl:
"CRecordSet类可以使用SetLockingMode设置在Edit加锁",是指在你Edit ADO缓冲区里的数据时加锁,并不是读数据库时就立即加锁。
DaQiangZi 2002-07-13
  • 打赏
  • 举报
回复
请问“老狼”,Access 数据库是否支持 TRANSACTION,我在ASP的页面中用ADODB.Connection 的 BeginTrans 方法就出错,是不是 Access 不支持 TRANSACTION 啊?
resicler 2002-07-12
  • 打赏
  • 举报
回复
老狼兄所说的:SQL语句可以写成SELECT* FROM a WHERE 1=1 FOR UPDATE,加了FOR UPDATE后数据库会给记录加锁,而我用的数据库就是ORACLE,在ORACLE中会把行级锁变成表锁的吧?
resicler 2002-07-12
  • 打赏
  • 举报
回复
也就是说解决的办法就是同时不要有多个进程一起对该资源进行操作喽?
resicler 2002-07-12
  • 打赏
  • 举报
回复
用CRecordSet类操作数据库。
colorknight 2002-07-12
  • 打赏
  • 举报
回复
同意老狼的观点,这是在数据库做的同步。另外,还有一种用应用程序来控制同步,简单说就是大家共享一个互斥,谁要对数据库操作,谁就得到互斥,跟加锁很象,不过和表加锁运用的环境不完全一样,当然也可二者一块使用。
RodgerLiang 2002-07-12
  • 打赏
  • 举报
回复
这其实是在读记录时加锁的问题。
如果你用的是ORACLE,你的SQL语句可以写成SELECT* FROM a WHERE 1=1 FOR UPDATE,加了FOR UPDATE后数据库会给记录加锁,当另一个进程也用同样的语句读时,它会等到前一个释放该所才能读到。

你的SQL语句应该写在一个TRANSACTION中,当你的TRANSACTION被COMMIT或ROLLBACK以后,锁住的记录才会被释放.

不过这会影响程序的性能。
dingkl 2002-07-12
  • 打赏
  • 举报
回复
用的存储过程还是CRecordSet类直接操作数据库?
dingkl 2002-07-12
  • 打赏
  • 举报
回复
不是数据库自动加锁,是你主动加锁
resicler 2002-07-12
  • 打赏
  • 举报
回复
从数据库中检索数据是没办法对纪录加锁的吧?除非你进行更新或删除。
dingkl 2002-07-12
  • 打赏
  • 举报
回复
发现空闲时,先加锁(记录级),再读取看是否真的空闲,然后修改
resicler 2002-07-12
  • 打赏
  • 举报
回复
补充:在进行数据库更新时会对记录加锁。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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