如何锁定一Interbase表不让其他用户修改?(100分)

  • 主题发起人 主题发起人 wangh
  • 开始时间 开始时间
你的意思无非是想保证数据库的一致性。因此,用事务就能解决问题了吧。

BEGIN TRANSACTION

....


COMMIT TRANSACTION或 ROLLBACK TRANSACTION。
 
感谢 wuyi,
不过, 我想在对该表进行某项操作时, 防止其他用户修改该表.
用事务并不能解决

 
IB中我没具体做过,但在ORACLE或MSSQL中都有各种锁。如:

SELECT * FROM YOURTABLE (TABLOCK HOLDLOCK)

我想IB也肯定有相应的加锁机制。你自己找找看。我的机器上

现在没有IB。
 
IB 没有上述加锁机制, 其加锁机制好象在 set transaction中
我不知如何将set transaction从delphi传到server中, 按照手册
中介绍的显式事务管理的第二种方法一直试不通.
 
Database.StartTransaction 不行吗?
 
我考虑可以这样实现
方法1
使用Database.StartTransaction 当你对某个表进行修改操作时,IB会自动对该
表加表互斥锁,你不必顾虑别人对该表进行操作。
方法2
实现人工加锁。可以大家程序先约定对数据库访问时用一个MUTEX,保证取名相同
A thread uses the CreateMutex function to create a mutex object. The creating thread can request immediate ownership of the mutex object and can also specify a name for the mutex object. Threads in other processes can open a handle to an existing mutex object by specifying its name in a call to CreateMutex.
从而实现进程间的通讯。
HANDLE hMutex;

hMutex = CreateMutex
(
NULL, // no security attributes
FALSE, // initially not owned
"MutexToProtectDatabase"); // name of mutex

if (hMutex == NULL)
{
// Check for error.
}
BOOL FunctionToWriteToDatabase(HANDLE hMutex)
{
DWORD dwWaitResult;


dwWaitResult = WaitForSingleObject(
hMutex, // handle of mutex
5000L); // five-second time-out interval

switch (dwWaitResult)
{
case WAIT_OBJECT_0:
try
{
// Write to the database.
}

finally
{
if (! ReleaseMutex(hMutex))
{
// Deal with error.
}

break;
}

// Cannot get mutex ownership due to time-out.
case WAIT_TIMEOUT:
return FALSE;

// Got ownership of the abandoned mutex object.
case WAIT_ABANDONED:
return FALSE;
}

return TRUE;
}



 
1. database.starttransaction 只能锁定被修改的行, 我想锁定整个表.
2. mutex 对于C/S结构,能保证网络上的其他机器上用户不能对表进行修改操作吗?

另外请教: 用database.starttransaction时, 如发生锁冲突, 能否让其等待,而非产生异常.
 
我用SQL-Server,不太了解Interbase,但是...

第一,我用database.starttransaction可以所定整个表,
(别人都打不开了)
第二,发生所冲突的时候自动处于等待状态,
直至另一个用户的transaction结束。

如果Interbase不能实现这两点,说明这个问题和DBMS的功能有关。
 
1.用table控件,将独占属性打开,该表别人应当不能打开吧。(没试过)
2.运行一个事务处理,将库(database.translsoloation)的隔离级定最高的一级,这时,其他事务过程
绝对修改不了表。只有在你的事务过程结束后,其他事务才能接续。
 
yaojiaqing,
我已试, 1,2均不能锁定整个表.(用interbase)
dwwang,
我用interbase自带的isql时, 如果发生锁冲突, 则等待.
 
多人接受答案了。
 
后退
顶部