Menempatkan pernyataan Pilih dalam transaksi


10

Apa perbedaan antara 2 pertanyaan ini:

START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;

Dan tanpa transaksi:

SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;  

Apa efek dari memiliki SELECTtransaksi di dalam?

Jika DELETE FROM orders WHERE id=1dipanggil dari sesi lain tepat setelah SELECTkedua kasus, kapan akan diproses?

Jawaban:


5

Permintaan SELECT dalam transaksi, dengan sendirinya, tidak terlindung dengan baik dari UPDATE dan DELETE.

Apa yang perlu Anda gunakan berikut ini:

Jika Anda menerbitkan Delete From orders Where id=1, itu akan terjadi setelah baris di orderstabel telah merilis kunci mereka di akhir transaksi. Anda dapat bereksperimen (pada Server Dev / Staging) dengan menggunakan READ UNCOMMITTEDtingkat isolasi transaksi untuk membuat penghapusan terjadi secara logis, tetapi hanya pada komit yang akan terlihat dan dicatat secara permanen.

Dalam transaksi kedua, pada dasarnya semua taruhan dibatalkan. Jika Anda berlari

select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;

menjalankan Delete From orders Where id=1akan melakukan segera. Bergantung pada urutan MySQL menjalankan pernyataan ini, apakah Anda akan melihat (atau tidak melihat) baris hapus.

CAVEAT

MySQL 5.6 sekarang memiliki yang berikut :

  • START TRANSACTION READ WRITE;
  • START TRANSACTION READ ONLY;

READ WRITE dan READ ONLY modifier mengatur mode akses transaksi. Mereka mengizinkan atau melarang perubahan pada tabel yang digunakan dalam transaksi. Pembatasan READ ONLY mencegah transaksi dari memodifikasi atau mengunci tabel transaksional dan nontransaksional yang dapat dilihat oleh transaksi lain; transaksi masih dapat memodifikasi atau mengunci tabel sementara. Pengubah ini tersedia pada MySQL 5.6.5.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.