我正试图锁定表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是稍后当我完成更改时。
提前致谢
答案 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)
上述命令将在事务外部对其他读取和更新进行排队,直到事务提交或回滚