如何锁定记录和更新自己锁定的记录。 (Asp.Net 和 ADS)
Posted
技术标签:
【中文标题】如何锁定记录和更新自己锁定的记录。 (Asp.Net 和 ADS)【英文标题】:How to lock record and update record that locked by myself. (Asp.Net and ADS) 【发布时间】:2012-09-10 14:01:06 【问题描述】:我想锁定一条记录以防止在我使用时没有人可以更新。
但是锁定记录后,连我自己都无法更新锁定记录:(
我必须先解锁才能更新记录吗?
或者有没有办法更新我自己锁定的记录?
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();
【问题讨论】:
【参考方案1】:不可能在“直接”打开的表(而不是通过 SQL 操作)和 SQL 操作或其他表实例之间共享记录锁。
一种可能性是在获得锁后通过扩展阅读器进行更新。您可以使用SetString 或SetValue。
reader.SetString( colNumber, 'UPDATED' );
另一种可能是更新事务中的记录。然后该记录将由该用户保持锁定,直到提交事务。例如,您可以使用类似以下语句作为“无操作”(假设不涉及触发器)来锁定事务中的记录而不修改数据:
UPDATE table1 set field1 = field1 WHERE pk=1;
【讨论】:
太棒了!第二种方法完美!非常感谢!【参考方案2】:您不能锁定它,然后使用不同的 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();
【讨论】:
以上是关于如何锁定记录和更新自己锁定的记录。 (Asp.Net 和 ADS)的主要内容,如果未能解决你的问题,请参考以下文章