Rumah  >  Soal Jawab  >  teks badan

Mengenai isu kawalan transaksi dalam sqlite3

Apabila merangkum kaedah mengendalikan pangkalan data sqlite3, kod ujian adalah seperti berikut:

$path = 'test.db';

$conn = new sqlite3($path); .. .';

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

  $conn->query($sql);


}

Sebab saya nak tambah kawalan transaksi, tetapi saya mendapatnya Saya tidak menemui sebarang kaedah tentang sqlite3 Cara menambah transaksi menggunakan pdo(). Saya telah menulis Java sebelum ini, dan saya belum biasa dengan PHP. Saya harap semua pengekod boleh menjawabnya, terima kasih.

逐日狂魔逐日狂魔2580 hari yang lalu976

membalas semua(1)saya akan balas

  • ringa_lee

    ringa_lee2017-10-21 09:51:38

    //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 );

    menghadapi masalah seperti itu semasa proses pembangunan:

    beroperasi pada jadual berbeza dua fail pangkalan data masing-masing Urutan pelaksanaan ialah: buka db A->mulakan transaksi->buka db B->pilih daripada db B-. >tutup db B->pilih daripada db A->rollbak atau commit->tutup db A

    Ujian mendapati bahawa langkah pilih daripada db B akan membuat ralat Mesej ralat adalah rutin perpustakaan yang dipanggil urutan Selepas ralat Laksanakan rollback, langkah ini juga akan melaporkan ralat.

    Pada asalnya saya fikir sebabnya ialah: memulakan transaksi hanya boleh beroperasi pada satu pangkalan data.

    Ujian mendapati bahawa walaupun transaksi tidak dimulakan, urutan pelaksanaan ialah: buka db A->buka db B->pilih daripada db B->tutup db B->pilih daripada db A-> ;close db A, Ralat rutin perpustakaan yang dipanggil keluar dari urutan masih berlaku.

    Adakah benar jika anda membuka pangkalan data, anda tidak boleh membuka pangkalan data lain sebelum menutupnya?

    Adakah pelaksanaan serentak sqlite perlu dikawal oleh pengguna?

    Saya mendapati hari ini bahawa punca ralat di atas mungkin disebabkan pembolehubah global program kawalan induk dan subrutin adalah konsisten (kedua-duanya adalah sqlite3 *db), ​​​​menyebabkan pembolehubah global program kawalan induk diubah suai .

    Perincian memerlukan penyelidikan lanjut.

    balas
    0
  • Batalbalas