用于锁定表C#的IsolationLevel

时间:2015-03-09 21:06:18

标签: c# sql-server

我正试图锁定表som,其他客户端无法更改,直到我完成但它无法正常工作。我创造了2个projekt,两者完全一样。我同时开始这些项目。当我选择表时,它应该锁定该表,但另一个项目仍然可以获取表并进行更改。这是我已经完成的代码。

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是稍后当我完成更改时。

提前致谢

2 个答案:

答案 0 :(得分:1)

这是您尝试的现代语法。此外,根据文档,您不应要求使用IsolationLevel.Serializable的表提示。要保持锁定,您需要先创建事务,然后再从第一个查询中进行选择。

使用TransactionScopes时,框架将自动在打开的事务中注册连接,并在未调用scope.Complete()时自动回滚。即发生错误或由于验证失败而跳过了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();
}

答案 1 :(得分:0)

尝试使用TABLOCKX:

SELECT * FROM table (TABLOCKX)

上述命令将在事务外部对其他读取和更新进行排队,直到事务提交或回滚