2014-10-08 3 views
0

SQL에 대한 일종의 잠금을 달성하려고합니다. 내가 간단한 뭐하는 거지 설명하기 : 이 항목이 PK로 아이디 INT의 자동 증가하고, 하나 개의 필드 데이터 VARCHAR (최대)SQL 잠금 행, 삽입 및 선택시 테이블

지금 내가 검사를 simlpy 일부 C# 코드가 클러스터되지 않은 IX와 한 테이블에없는 경우

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

및 선택 하나입니다 : : DB에, 삽입 난 뒤에 사용하고하는 것은 같다 SQL 코드를 만드는

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

하지만 난 같은과 항목이 있음을 알 수 삽입 된 값 m 궁극적으로는 TABLOCK은 교착 상태를 만듭니다. 고유 인덱스는 매우 느리기 때문에 사용하지 않으려합니다.

잠금을 사용하여이를 달성 할 수있는 방법이 있습니까?

+0

what sql engine? – SriniV

+0

db 내의 열에 대해 고유 한 제약 조건을 넣을 수 있습니다. 이미 존재할 때 동일한 값이 삽입되는 것을 방지합니다. – MarkD

+0

SQL Server 2008 및 MarkD, 삽입 문에 고유 인덱스 – user3057678

답변

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