Transaksi MySQL PHP antar database

Saya tidak dapat menemukan jawaban pasti apakah diperbolehkan melakukan transaksi dalam PHP mencakup banyak database atau tidak.

Saya menggunakan objek koneksi yang sama (mysqli) dan melakukan transaksi dengan cara ini:

$mysqli->autocommit(false);

try {

    // Assume here that some code would throw an exception

    $stmt = $mysqli->prepare("INSERT INTO db1.x (column) VALUES (y)");
    $stmt->execute();
    $stmt->close();

    $stmt = $mysqli->prepare("INSERT INTO db2.x (column) VALUES (y)");
    $stmt->execute();
    $stmt->close();

    $mysqli->commit();
    // Great success

} catch (Exception $e) {

    $mysqli->rollback();
    throw $e; // handle elsewhere

}

Apakah ini diperbolehkan dan apakah akan dilakukan dan diputar kembali dengan benar? Menurut manual (http://dev.mysql.com/doc/refman/5.6/en/xa.html) dan utas lainnya di SO, sepertinya saya perlu menggunakan pernyataan XA, tetapi tidak begitu jelas (bagi saya) apakah ini saat menggunakan beberapa server database, banyak koneksi atau secara umum ketika menjalankan kode di atas.


person nickdnk    schedule 24.02.2016    source sumber
comment
Saya berasumsi jika mereka berada di mesin host DB yang sama, itu akan berhasil.   -  person Ray    schedule 25.02.2016
comment
Jika tidak, saya tidak dapat menggunakan objek mysqli yang sama untuk kedua pernyataan.   -  person nickdnk    schedule 25.02.2016
comment
ya, itu akan berhasil, dalam kasus khusus ini. transaksi dilakukan per koneksi. jika Anda membuka dua koneksi, dan memulai transaksi di masing-masing koneksi, maka Anda memiliki dua transaksi yang benar-benar terpisah/berbeda, dan tindakan pada satu koneksi tidak akan memengaruhi yang lain.   -  person Marc B    schedule 25.02.2016
comment
@MarcB - Saya menyadarinya, dan itulah mengapa pertanyaannya secara khusus menyatakan bahwa saya menggunakan objek koneksi yang sama. Jika Anda yakin dan dapat mendukung klaim Anda, silakan kirimkan jawaban :)   -  person nickdnk    schedule 25.02.2016
comment
Sepertinya contoh ini sudah berisi hampir semua yang Anda perlukan untuk memverifikasinya.   -  person Don't Panic    schedule 25.02.2016
comment
@Don'tPanic Haha - ya, tapi saya tidak 100% yakin bahwa tampaknya berhasil selalu sama dengan Anda harus melakukannya dengan cara ini dan itulah yang seharusnya dilakukan :)   -  person nickdnk    schedule 25.02.2016


Jawaban (2)


Sesuai permintaan komentar di atas, menghilangkan umpan balik buat/gunakan:

mysql> create database x;
mysql> use x;
mysql> create table x (x int);
mysql> create database y;
mysql> use y;
mysql> create table y (y int);
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into x.x values (1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into y.y values (1);
Query OK, 1 row affected (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from x.x;
Empty set (0.00 sec)

mysql> select * from y.y;
Empty set (0.00 sec)

Perhatikan bahwa ini semua ada dalam satu koneksi, ke satu instance mysql. Ini TIDAK akan berfungsi jika dbs dihosting di server yang berbeda, atau Anda melakukan setiap pembuatan/penyisipan pada koneksi yang berbeda.

person Marc B    schedule 24.02.2016
comment
Saya pikir saya akan mengambil kata-kata Anda dan contoh ini. Terima kasih :) - person nickdnk; 25.02.2016

Transaksi berlaku untuk server secara keseluruhan. Basis data hanya digunakan untuk mengelompokkan tabel untuk tujuan memberikan izin (misalnya, Anda dapat memberikan izin kepada database.*) dan memberikan beberapa default saat membuat tabel baru. Dan mereka digunakan untuk memungkinkan Anda memilih database default dengan pernyataan USE, sehingga Anda tidak perlu menentukan nama database pada setiap query.

person Barmar    schedule 24.02.2016