如何锁定自己锁定的记录和更新记录。 (Asp.Net和ADS)

时间:2012-09-10 14:01:07

标签: advantage-database-server

我想锁定一条记录,以防止在我使用时无人更新。

但是在锁定记录之后,即使我自己也无法更新锁定记录:(

在更新记录之前是否必须解锁?

或者有没有办法更新我自己锁定的记录?

string query = "SELECT * FROM table1";
AdsCommand cmd = conn.CreateCommand();
cmd.CommandText = query;

AdsExtendedReader reader = cmd.ExecuteExtendedReader();
reader.Read();

int recordNo = reader.RecordNumber;
reader.LockRecord(recordNo);

// do something with table1 record
// while doing something, I need to lock the record before I update record

AdsCommand cm = new AdsCommand("UPDATE table1 SET field1 = 'UPDATED'", conn);
cm.ExecuteNonQuery();

2 个答案:

答案 0 :(得分:4)

无法在“直接”(而不是通过SQL操作)打开的表与SQL操作或其他表实例之间共享记录锁。

一种可能性是在获得锁定后通过扩展阅读器进行更新。您可以使用SetStringSetValue

reader.SetString( colNumber, 'UPDATED' );

另一种可能性是更新交易记录。然后该记录将被该用户锁定,直到提交事务为止。例如,你可以使用类似下面的语句作为“no-op”(假设不涉及触发器)来锁定事务中的记录而不修改数据:

UPDATE table1 set field1 = field1 WHERE pk=1;

答案 1 :(得分:0)

您无法锁定它,然后使用其他SQL语句更新它;这将打开查询的另一个实例,这是因为您使用第一个锁定表而无法实现。只是不要担心锁定它,并运行您的UPDATE语句。 ADS将锁定记录,进行更改并自动为您解锁。

// Note I added a WHERE statement with a dummy value for `finvno`, since your 
// select didn't provide one 
AdsCommand cm = new AdsCommand("UPDATE table1 SET field1 = 'UPDATED' WHERE finvno = 'SomeInvNo'", conn);
cm.ExecuteNonQuery();