如何锁定记录和更新自己锁定的记录。 (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)的主要内容,如果未能解决你的问题,请参考以下文章

如何解除物料的相互锁定

选择更新锁定

插入记录时锁定

使用内连接进行查询的方法,用于更新 X 跳过锁定、排序和限制

如何锁定访问子表单中的记录

SQL Server - 合并大表而不锁定数据