【问题标题】:Is there a way to lock one record before starting to modify that record?有没有办法在开始修改该记录之前锁定一条记录?
【发布时间】:2017-04-09 18:54:06
【问题描述】:

有没有办法在开始修改记录之前锁定一条记录?

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 之后释放记录锁。

【问题讨论】:

  • 这就是交易的用途。你想达到什么目的?
  • 目的是防止两个人同时更改同一个记录。根据您的评论,Mark Rotteveel,交易似乎锁定了记录。在这篇文章之前,我进行了一次互联网搜索……没有看到任何将交易与锁定记录联系起来的内容。感谢您的澄清!
  • 如果您更新,那么另一个事务无法更新同一条记录,而第一个事务尚未提交。
  • 这取决于事务的隔离级别。
  • @WilliamXifaras 在 Firebird 中,尝试更新已经被另一个 - 仍处于活动状态 - 事务更新的记录将导致更新冲突,取决于事务隔离是否允许您更新在该事务提交后记录。

标签: c# ado.net firebird firebird-embedded


【解决方案1】:

根据你想怎么做,你可以使用(小心)选择的“WITH LOCK”子句,它会变成一个悲观锁(这就是为什么你在使用它时需要小心)。更多信息https://firebirdsql.org/refdocs/langrefupd21-notes-withlock.html “愚蠢”的更新也将充当悲观锁。

【讨论】:

    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多