11,849
社区成员
发帖
与我相关
我的任务
分享
在对表的修改或删除前进行上锁判断
/// <summary>
/// 锁表(行级锁)
/// </summary>
/// <param name="TableName">表名</param>
/// <param name="Id">要上锁的记录Id</param>
/// <returns></returns>
public bool LockTableRow(string TableName, string Id)
{
try
{
string SQL;
SqlCommand myCommand = this._SqlConnection.CreateCommand();
myCommand.CommandTimeout = 5;
SQL = "select * from " + TableName + " with (holdlock updlock rowlock) where Id='" + Id + "'";
myCommand.CommandText = SQL;
if (_Transaction != null) myCommand.Transaction = _Transaction;
try
{
myCommand.ExecuteNonQuery();
//锁表成功
return true;
}
catch (System.Data.SqlClient.SqlException e)
{
//锁表失败
if (e.Message.ToUpper().IndexOf("TIME") >= 0)
return false;
else
throw e;
}
catch (System.Exception e)
{
throw e;
}
}
catch (System.Exception ex)
{
string errMsg = "锁表(行级锁)" + ex.Message + " TableName:" + TableName + " Id:" + Id;
throw this.GetError(errMsg);
}
}
/// <summary>
/// 判断某个表是否可以上锁
/// </summary>
/// <param name="TableName">表名</param>
/// <returns></returns>
private bool IsLock(string TableName)
{
try
{
SqlCommand myCommand = this._SqlConnection.CreateCommand();
myCommand.CommandTimeout = 10;
string SQL = "select top 1 * from " + TableName + " with (updlock)";
if (_Transaction != null) myCommand.Transaction = _Transaction;
myCommand.CommandText = SQL;
myCommand.ExecuteNonQuery();
return false;
}
catch (System.Exception g)
{
if (g.Message.ToUpper().IndexOf("TIME") >= 0)
return true;
else
throw g;
}
}
其他查询的地方用nolock文式查询即可