【问题标题】:IsolationLevel to lock table C#IsolationLevel 锁定表 C#
【发布时间】:2015-03-10 06:39:22
【问题描述】:

我正在尝试锁定表,其他客户端在我完成之前无法更改它,但它无法正常工作。我创建了 2 个项目,两者完全相同。我同时开始这些项目。当我选择表格时,它应该锁定该表格,但其他项目仍然可以获取表格并进行更改。这是我做的代码。

SqlConnection con = new SqlConnection(ConStr);
con.Open();
SqlCommand _Command = new SqlCommand("SELECT * FROM " + table + " WITH (TABLOCK,HOLDLOCK)", con);
_Command.CommandType = CommandType.Text;
_Command = con.CreateCommand();
SqlTransaction _Transaction = con.BeginTransaction(IsolationLevel.Serializable);            
_Command.Connection = con;
_Command.Transaction = _Transaction ;

public void Commit()
    {
        _Command.CommandText = "UPDATE " + table + " SET " + column[1] + " = '" +
                            txtBox1.Text + "', " + column[2] + " = '" +
                            txtBox2.Text + "', " + column[3] + " = '" +
                            txtBox3.Text + "', " + column[4] + " = '" +
                            txtBox4.Text + "' WHERE " + column[0] + " = " + txtBox0.Text;
        _Command.ExecuteNonQuery();
        if (_Transaction != null)
        {
            _Transaction .Commit();
        }
    }

public void commit 是在我完成更改后使用的。

提前致谢

【问题讨论】:

标签: c# sql-server


【解决方案1】:

这是您正在尝试的现代语法。此外,根据文档,您不应该要求带有 IsolationLevel.Serializable 的表提示。为了维护您的锁定,您需要在从第一个查询中选择之前创建您的事务。

使用 TransactionScopes 时,框架将自动在打开的事务中注册连接,并在未调用 scope.Complete() 时自动回滚。 IE。发生错误或您因验证失败而跳过了 scope.Complete()。

https://msdn.microsoft.com/en-us/library/system.data.isolationlevel%28v=vs.110%29.aspx

var options = new TransactionOptions();
options.IsolationLevel = IsolationLevel.Serializable;

using (var scope = new TransactionScope(TransactionScopeOption.Required, options))
{
    var something = ReadSomething();
    WriteSomething(something);
    scope.Complete();
}

【讨论】:

  • 嗨,我已将我的代码移动到您创建的范围内。唯一不同的是 scope.complete 我已经提交但仍然无法正常工作。 :(
【解决方案2】:

尝试使用 TABLOCKX :

SELECT * FROM table (TABLOCKX)

上面的命令会将你事务之外的其他读取和更新排队,直到事务提交或回滚

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多