我试图在sql上实现某种锁定。 解释我在做什么很简单: 一个表,其中Id int自动增量为PK,一个字段为数据varchar(max)非群集IX
现在我有一些C#代码,如果该项目不在数据库中,则会进行simlpy检查,进行插入 我正在使用的sql代码如下:
INSERT INTO {0}.{1} WITH (TABLOCKX) VALUES(@data...)
,选择的是:
SELECT Id FROM {0}.{1} WITH (TABLOCKX) WHERE(Data = @data)
但我可以看到有多次插入相同值的项目 TABLOCK会创建死锁,我不想使用唯一索引,因为它非常慢。
有没有办法通过锁定实现这一目标?
答案 0 :(得分:1)
我不确定这是你想要的,我希望这个回复很有用。
private void test(string aConnectionString, string aData)
{
using (SqlConnection sqlConnection = new SqlConnection(aConnectionString))
{
sqlConnection.Open();
SqlCommand sqlCommand = sqlConnection.CreateCommand();
SqlTransaction sqlTransaction = sqlConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
sqlCommand.Connection = sqlConnection;
sqlCommand.Transaction = sqlTransaction;
try
{
sqlCommand.CommandText = @"IF NOT EXISTS(SELECT Id FROM {0}.{1} WHERE Data = @Data)
BEGIN
INSERT INTO {0}.{1}
SELECT @Data
END";
sqlCommand.Parameters.Add("@Data", System.Data.SqlDbType.VarChar).Value = aData;
sqlTransaction.Commit();
}
catch (Exception ex)
{
sqlTransaction.Rollback();
}
}
}