sqlite3의 트랜잭션 제어 문제 정보
逐日狂魔
逐日狂魔 2017-10-20 16:25:54
0
1
988

sqlite3 데이터베이스 운영 방법을 캡슐화할 때 테스트 코드는 다음과 같습니다.

$path = 'test.db';

$conn = new sqlite3($path) = 'insert into tb_test; .. .';

for($i=0;$i<10000,$i++){

  $conn->query($sql);


}

트랜잭션 제어를 추가하고 싶기 때문에, 하지만 sqlite3에 대한 방법을 찾지 못했습니다. 트랜잭션을 추가하는 방법은 새로운 pdo()를 사용하는 것입니다. 저는 이전에 Java를 작성해 왔지만 아직 PHP에 익숙하지 않습니다. 모든 코더가 답변해 주셨으면 좋겠습니다. 감사합니다.

逐日狂魔
逐日狂魔

모든 응답(1)
ringa_lee
//sqlite3 事务的操作没有特别的接口函数,就是一个普通的 sql 语句而已,分别如下:
int ret ; 
ret = sqlite3_exec ( db , "begin transaction" , 0 , 0 , & zErrorMsg ); // 开始一个事务 
ret = sqlite3_exec ( db , "commit transaction" , 0 , 0 , & zErrorMsg ); // 提交事务 
ret = sqlite3_exec ( db , "rollback transaction" , 0 , 0 , & zErrorMsg );     

//如果要进行大量的操作前使用如下语句 
ret = sqlite3_exec ( db , "begin transaction" , 0 , 0 ,& zErrorMsg ); 
for (...) {   
//insert into operate     
// 如果操作错误  
ret = sqlite3_exec ( db , "rollback transaction" , 0 , 0 , & zErrorMsg )
 } 
 ret = sqlite3_exec ( db , "commit transaction" , 0 , 0 , & zErrorMsg );

는 개발 과정에서 다음과 같은 문제에 직면했습니다:

두 데이터베이스 파일의 서로 다른 테이블에서 각각 작동합니다. 실행 순서는 다음과 같습니다: db A 열기->트랜잭션 시작->db B 열기->db B에서 선택- >db B 닫기->db A에서 선택->rollbak 또는 커밋->db A 닫기

테스트 결과 db B 단계에서 선택하면 오류가 발생하는 것으로 나타났습니다. 오류 메시지는 다음에서 호출되었습니다. 롤백 실행 오류 후에 이 단계에서도 오류가 보고됩니다.

원래 그 이유는 트랜잭션 시작이 하나의 데이터베이스에서만 작동할 수 있기 때문이라고 생각했습니다.

테스트 결과 트랜잭션이 시작되지 않은 경우에도 실행 순서는 다음과 같습니다. db A 열기 -> db B 열기 -> db B에서 선택 -> db B 닫기 -> db A에서 선택 -> ;close db A, 순서 없이 호출된 라이브러리 루틴 오류가 계속 발생합니다.

데이터베이스를 열면 닫기 전에 다른 데이터베이스를 열 수 없다는 것이 사실인가요?

sqlite의 동시 실행을 사용자가 제어해야 하나요?

위 오류의 원인은 마스터 제어 프로그램의 전역 변수와 서브루틴이 일관적(둘 다 sqlite3 *db)으로 인해 마스터 제어 프로그램의 전역 변수가 수정되었기 때문일 수 있음을 오늘 발견했습니다. .

자세한 내용은 추가 조사가 필요합니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿