在开始修改记录之前是否有办法锁定一条记录?
问题描述:
在开始修改记录之前是否有办法锁定一条记录?在开始修改记录之前是否有办法锁定一条记录?
string stOpenConn = new FbConnectionStringBuilder {
Database = stPathFilename,
UserID = stUserID,
Password = stPassword,
ServerType = FbServerType.Embedded,
ClientLibrary = stCLIENT_LIBRARY
}.ToString();
try {
using(FbConnection fbConn = new FbConnection(stOpenConn)) {
fbConn.Open();
string stCmd = "UPDATE " + stTableName + " SET " + liststFieldNamesNoKeyID[0] + " = @p0";
for (int iii = 1; iii < liststFieldNamesNoKeyID.Count(); iii++)
stCmd += ", " + liststFieldNamesNoKeyID[iii] + " = @p" + iii.ToString();
stCmd += " WHERE" + stFieldKeyID + "= @p" + liststFieldNamesNoKeyID.Count().ToString();
FbTransaction fbTransaction = fbConn.BeginTransaction();
using (FbCommand fbCmd = new FbCommand(stCmd, fbConn, fbTransaction)) {
for (int iii = 0; iii < liststFieldNamesNoKeyID.Count(); iii++) {
string stPlaceHolder = "@p" + (iii).ToString();
string stValue = liststNewValuesNoKeyID[iii];
fbCmd.Parameters.AddWithValue(stPlaceHolder, stValue);
}
int iKeyID = Convert.ToInt32(stKeyID);
fbCmd.Parameters.AddWithValue("@p" + liststFieldNamesNoKeyID.Count().ToString(), iKeyID);
fbCmd.ExecuteNonQuery();
fbTransaction.Commit();
}//using
}//using
}//try
然后修改后发布完成?
我认为记录锁定发生在连接打开后...在BeginTransaction之前...并在fbTransaction.Commit之后释放记录锁定。
答
根据你想怎么做,你可以使用(小心)选择的“WITH LOCK”子句,这将变成悲观锁(这就是为什么你需要谨慎使用它)。更多信息,请参阅https://firebirdsql.org/refdocs/langrefupd21-notes-withlock.html “愚蠢”更新也会作为悲观锁定。
这是交易的目的。你想达到什么目的? –
目的是让两个人同时更改相同的记录。根据您的评论,Mark Rotteveel看来,交易锁定了记录。在这篇文章之前,我曾经进行过互联网搜索......没有看到任何将交易锁定在记录上的事情。感谢您的澄清! – ttom
如果更新,则另一个事务不能更新该记录,而第一个事务尚未提交。 –