2014-10-08 116 views
0

我想在sql上實現某種鎖定。 爲了解釋我在做什麼簡單: 與ID INT自動增量的PK,和一個字段中的數據爲varchar(最大)非羣集IXSQL鎖行,插入表並選擇

現在我有simlpy檢查一些C#代碼的一個表,如果該項目不在db,使插入 的SQL代碼,我使用的背後是這樣的:

INSERT INTO {0}.{1} WITH (TABLOCKX) VALUES(@data...) 

和選擇之一是:

SELECT Id FROM {0}.{1} WITH (TABLOCKX) WHERE(Data = @data) 

,但我可以看到,有與相同的項目值插入m ultiple times TABLOCK創建死鎖,我不想使用唯一索引,因爲它非常慢。

有沒有辦法實現這與鎖?

+0

什麼是sql引擎? – SriniV 2014-10-08 12:51:00

+0

你可以對數據庫中的列設置一個唯一的約束,這將防止當它已經存在時插入相同的值 – MarkD 2014-10-08 12:51:01

+0

SQL Server 2008和MarkD,我不想在你的插入語句中使用唯一索引 – user3057678 2014-10-08 12:56:44

回答

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