gpt4 book ai didi

C#、SQL Server - 锁定表行读取,根据需要进行编辑并释放锁定

转载 作者:行者123 更新时间:2023-12-04 10:54:18 25 4
gpt4 key购买 nike

当我为同一行执行更新逻辑时,我需要在行级别阻止数据库读取。漂亮而干净的解决方案会是什么样子?这是我正在处理的一些代码:

using (SqlConnection conn = new SqlConnection(Configuration.ConnectionString)) {
conn.Open();
using (SqlTransaction tran = conn.BeginTransaction(IsolationLevel.Serializable)) {
//TODO lock table row with ID=primaryKey (block other reads and updates)
using (SqlCommand cmd = new SqlCommand("SELECT Data FROM MyTable WHERE ID=@primaryKey", conn)) {
cmd.Parameters.AddWithValue("@primaryKey", primaryKey);
using (var reader = cmd.ExecuteReader()) {
data = PopulateData(reader);
};
}

if (isUpdateNeeded(data)) {
ChangeExternalSystemStateAndUpdateData(data) //EDIT - concurrent calls not allowed
WriteUpdatesToDatabase(conn, tran, data); //EDIT
tran.Commit();
}


} //realease lock and allow other processes to read row with ID=primaryKey
}

编辑:

我有以下限制:
  • 代码可以在不同的应用程序池中同时执行。所以内存锁不是一个选项
  • ChangeExternalSystemStateAndUpdateData() 必须在 MyTable 行的范围内只执行一次。并发调用会导致问题
  • 最佳答案

    通常这里的问题不是行锁定,而是:其他 SPID 在您的读取和更新之间获取读取锁 - 这可能导致死锁情况;这里的常见解决方法是在初始读取中获取写锁:

    SELECT Data FROM MyTable WITH (UPDLOCK) WHERE ID=@primaryKey

    请注意,如果另一个 SPID 显式使用 NOLOCK然后他们仍然会闪过它。

    您也可以尝试添加 ROWLOCK ,即 WITH (UPDLOCK, ROWLOCK) - 就我个人而言,我最初会保持简单。由于您处于可序列化的上下文中,因此尝试过于细化可能是失败的原因 - 键范围锁等。

    关于C#、SQL Server - 锁定表行读取,根据需要进行编辑并释放锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59301755/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com