SQL锁定行,插入表和选择

时间:2014-10-08 12:47:43

标签: sql

我试图在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会创建死锁,我不想使用唯一索引,因为它非常慢。

有没有办法通过锁定实现这一目标?

1 个答案:

答案 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();
            }
        }
    }