Saya benar-benar belum menemukan contoh file PHP normal di mana transaksi MySQL sedang digunakan. Dapatkah Anda menunjukkan kepada saya contoh sederhana tentang itu?
Dan satu pertanyaan lagi. Saya sudah melakukan banyak pemrograman dan tidak menggunakan transaksi. Bisakah saya memasukkan fungsi PHP atau sesuatu header.php
jika ada yang mysql_query
gagal, maka yang lain juga gagal?
Saya pikir saya sudah menemukan jawabannya, benarkah ?:
mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
$a1 = mysql_query("INSERT INTO rarara (l_id) VALUES('1')");
$a2 = mysql_query("INSERT INTO rarara (l_id) VALUES('2')");
if ($a1 and $a2) {
mysql_query("COMMIT");
} else {
mysql_query("ROLLBACK");
}
php
mysql
transactions
Selamat malam
sumber
sumber
mysql_query("BEGIN");
sebagai ganti urutanmysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
mysql_*
fungsi dalam kode baru . Mereka tidak lagi dipertahankan dan secara resmi ditinggalkan . Lihat kotak merah ? Pelajari tentang pernyataan yang disiapkan , dan gunakan PDO atau MySQLi - artikel ini akan membantu Anda memutuskan yang mana. Jika Anda memilih PDO, berikut adalah tutorial yang bagus .mysql
wun mati meskipun sudah usang, itu akan tersedia di PECL selamanya.mysql
Jawaban:
Ide yang biasanya saya gunakan ketika bekerja dengan transaksi terlihat seperti ini (semi-pseudo-code) :
Perhatikan bahwa, dengan gagasan ini, jika kueri gagal, Pengecualian harus dilemparkan:
PDO::setAttribute
PDO::ATTR_ERRMODE
danPDO::ERRMODE_EXCEPTION
Sayangnya, tidak ada sihir yang terlibat. Anda tidak bisa hanya menempatkan instruksi di suatu tempat dan melakukan transaksi secara otomatis: Anda masih harus menentukan kelompok kueri mana yang harus dieksekusi dalam transaksi.
Misalnya, cukup sering Anda akan memiliki beberapa pertanyaan sebelum transaksi (sebelum
begin
) dan beberapa kueri lain setelah transaksi (setelah salah satucommit
ataurollback
) dan Anda ingin kueri tersebut dieksekusi tidak peduli apa yang terjadi (atau tidak) di transaksi itu.sumber
$db
jenisnya di sini? mysqli?PDOException
dan bahkan memeriksa nilai pengecualian jika diperlukan. us2.php.net/PDOExceptionSaya pikir saya sudah menemukan jawabannya, benarkah ?:
sumber
sumber
Karena ini adalah hasil pertama di google untuk "transaksi php mysql", saya pikir saya akan menambahkan jawaban yang secara eksplisit menunjukkan bagaimana melakukan ini dengan mysqli (seperti yang diinginkan penulis asli contoh). Berikut adalah contoh transaksi yang disederhanakan dengan PHP / mysqli:
Juga, perlu diingat bahwa PHP 5.5 memiliki metode baru mysqli :: begin_transaction . Namun, ini belum didokumentasikan oleh tim PHP, dan saya masih terjebak di PHP 5.3, jadi saya tidak bisa mengomentarinya.
sumber
$conn->autocommit(FALSE)
, dalam contoh di atas, hanya mempengaruhi koneksi individu - tidak berpengaruh pada koneksi lain ke database.if (!result)
, harus dilakukanif (result === false)
, jika kueri mampu mengembalikan hasil yang valid yang akan dievaluasi menjadi false atau nol.Silakan periksa mesin penyimpanan mana yang Anda gunakan. Jika itu adalah MyISAM, maka
Transaction('COMMIT','ROLLBACK')
tidak akan didukung karena hanya mesin penyimpanan InnoDB, bukan MyISAM, yang mendukung transaksi.sumber
Saat menggunakan koneksi PDO:
Saya sering menggunakan kode berikut untuk manajemen transaksi:
Contoh penggunaan:
Dengan cara ini kode manajemen transaksi tidak digandakan di seluruh proyek. Yang merupakan hal yang baik, karena, kalau dilihat dari jawaban-jawaban lain yang direplikasi oleh PDO di utas ini, mudah untuk membuat kesalahan di dalamnya. Yang paling umum adalah lupa untuk menyusun kembali pengecualian dan memulai transaksi di dalam
try
blok.sumber
Saya membuat fungsi untuk mendapatkan vektor kueri dan melakukan transaksi, mungkin seseorang akan menemukannya berguna:
sumber
Saya punya ini, tetapi tidak yakin apakah ini benar. Bisa coba ini juga.
Ide dari sini: http://www.phpknowhow.com/mysql/transactions/
sumber
mysql_query
, alih-alih menggunakanmysqli
, meskipun Anda menautkan ke tutorial yang menggunakanmysqli
. IMHO, Anda harus menghapus contoh buruk ini, atau menggantinya dengan menggunakan kode seperti yang ditulis dalam tutorial phpknowhow.Satu lagi contoh gaya prosedural dengan
mysqli_multi_query
, diasumsikan$query
diisi dengan pernyataan yang dipisahkan dengan titik koma.sumber
mysqli_multi_query
. Siapa pun yang tertarik dengan itu harus mencari di tempat lain misalnya bersih.