我现在用ADO 联接 ms SQLserver2000数据库,如何实现当A用户从数据库里调出10条数据并锁定这10条数据,1)B用户无法读出这10条数据 2)B用户只能以只读的形式调出这10条数据。当A用户处理完修改保存后并释放锁定,则B用户才能修改这些数据。
我在处理这问题时,我是增加一个锁定字段标志或锁定表。当数据被A用户以编辑状态调出,在这些数据加上锁定标志,则B将无法进行编辑,但这样做有一个问题我无法解决,就是当A用户在编辑这些数据时,突然意外死机或退出,则数据标志无法被取消,那么就会造成,数据没人编辑,而且系统却认为有人在编辑,那么就只能用手动去除数据锁定标志了:( ,请问各位兄台有没有好的处理方法,不知ms SQLserver2000本身的锁定方式能不能解决这样的问题???
我在处理这问题时,我是增加一个锁定字段标志或锁定表。当数据被A用户以编辑状态调出,在这些数据加上锁定标志,则B将无法进行编辑,但这样做有一个问题我无法解决,就是当A用户在编辑这些数据时,突然意外死机或退出,则数据标志无法被取消,那么就会造成,数据没人编辑,而且系统却认为有人在编辑,那么就只能用手动去除数据锁定标志了:( ,请问各位兄台有没有好的处理方法,不知ms SQLserver2000本身的锁定方式能不能解决这样的问题???
程序在锁时,同时加上时间。
1)B用户无法读出这10条数据
这个我不知道怎么去做.B用户无法读出这10条数据,这个我觉得没有必要去实现.2)B用户无法读出这10条数据
这在VC中有多种实现方法:
(1)用CDatabase的事务去处理:
CXxxSet.Open();
CXxxSet.m_pDatabase->BeginTrans(); // CXxxSet是 CRecordset的派生类
//下面是对记录集的操作
......
CXxxSet.m_pDatabase->CommitTrans();
如果你对记录集改变的过程中失败则:
CXxxSet.m_pDatabase->RollBack();(2)调用CRecordset::SetLockingMode(parmeter);
顺便说一下:我个人认为就查询时就不用锁定记录集.
SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE
}
来分别处理,比如:
use pubs
go
set transaction isolation level SERIALIZABLEbegin tran test
select * from sales with (tablockx)
这样第二个用户就无法看到该表的记录。
如果
use pubs
go
set transaction isolation level read uncommitedbegin tran test
select * from sales with (tablockx)
这样第二个用户就看到该表的记录,但无法修改。
MSSQLSERVER2000的LOCK的机制是非常灵活的,你可以通过HINTS指定不同的LOCK来到底自己的需求。