2014-10-08 66 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(); 
      } 
     } 
    }