2016-09-17 3 views
0

상황은 이렇습니다. 나는 서버에있는 동일한 mysql db에 연결하는 두 개의 클라이언트 프로그램을 가지고있다. 나는델파이 2007 ZeosLib 6.6 MySQL 4.1 다른 클라이언트의 트랜잭션 잠금 테이블

 ZCon.TransactIsolationlevel := tiSerializable; 
     ZCon.AutoCommit := true; 
     ZCon.StartTransaction; 
     try 
      ZQGeneral.Close; 
      ZQGeneral.SQL.Clear; 

      ZQGeneral.SQL.Add('UPDATE table1 SET field1 = 1 WHERE id = 2'); 
      ZQGeneral.ExecSQL; 
      ZQGeneral.Close; 


      ZCon.Commit; 
      ZCon.TransactIsolationlevel := tinone; 
      ZCon.AutoCommit := False; 

     except 
      ZCon.Rollback; 
      ZCon.TransactIsolationlevel := tinone; 
      ZCon.AutoCommit := False; 
     end; 

테이블 (1)가 차단되어 다음과 같은 방법으로 테이블에 작업을 실행하고 거래를 완료 클라이언트 연결 해제 될 때까지 잠금을 해제하지 않을 때. 트랜잭션을 처음 시작한 클라이언트에서 테이블은 쓰기 가능하지만 다른 클라이언트는 읽기 전용입니다. msyql 계정에 모든 권한을 잘못 부여하지 않았기 때문에 트랜잭션 작업 후 UNLOCK 테이블을 보내려고했으나 도움이되지 않았습니다. 프로그램의 소스를 두 번 확인하여 열려있는 ZQuery를 잊어 버리지는 않았는지 확인합니다. 다른 클라이언트에 대해 table1의 잠금을 해제하지 않는 이유는 무엇입니까?

또한 동일한 동작으로 tiReadCommited 및 tiUnreadCommited를 시도했습니다. 또한 Zeos를 버전 7.2로 업그레이드하고 동일한 결과로 버전 5로 mysql을 변경하려고 시도했습니다. 아, InnoDB를 사용합니다.

답변

0

해결책을 찾았습니다. mysql에 연결하기 전에 autocommit을 true로 설정하고 transactisoltionlevel을 tiserializable로 설정하고 런타임에 변경하지 않고 필요할 때 암시 적 starttransaction을 사용하십시오.