Apakah transaksi bersarang diperbolehkan di MySQL?

89

Apakah MySQL mengizinkan penggunaan transaksi bersarang?

Alix Axel
sumber
5
mysql tidak mendukung transaksi bersarang
hamedkh

Jawaban:

78

InnoDB mendukung SAVEPOINTS .

Anda dapat melakukan hal berikut:

CREATE TABLE t_test (id INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;

START TRANSACTION;

INSERT
INTO    t_test
VALUES  (1);

SELECT  *
FROM    t_test;

 id
---
  1

SAVEPOINT tran2;

INSERT
INTO    t_test
VALUES  (2);

SELECT  *
FROM    t_test;

 id
---
  1
  2

ROLLBACK TO tran2;

SELECT  *
FROM    t_test;

 id
---
  1

ROLLBACK;

SELECT  *
FROM    t_test;

 id
---
Quassnoi
sumber
20
ini bukan pertanyaannya, "savepoints" adalah satu hal yang mendukung "transaksi bersarang" adalah pertanyaan sebenarnya. Lihat tautan ini
arod
1
@arod: dapatkah Anda menjelaskan perbedaannya dalam konteks utas tunggal? Terima kasih!
Quassnoi
@Quassnoi Saya yakin perintah yang dikeluarkan untuk DB berbeda, bukan? Saya mungkin salah
arod
2
@Quassnoi tautan yang saya berikan adalah untuk menunjukkan bahwa transaksi bersarang sekarang didukung. Sekarang, savepoint sangat kuat, tetapi tidak sama dengan BEGIN bersarang, COMMIT / ROLLBACK (berbicara secara programatik, berdasarkan perintah) meskipun Anda tampaknya cukup yakin bahwa dalam "konteks single-threaded", keduanya setara. Saya bermaksud untuk menjawab pertanyaan tersebut secara langsung (3 tahun kemudian :) ...
arod
12
@arod: Anda tahu bahwa tautan yang Anda berikan tidak ada hubungannya dengan MySQL, bukan?
Quassnoi
38

Dari dokumentasi MySQL:

Transaksi tidak dapat disarangkan. Ini adalah konsekuensi dari komit implisit yang dilakukan untuk setiap transaksi saat ini ketika Anda mengeluarkan pernyataan MULAI TRANSAKSI atau salah satu sinonimnya. https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

bancer
sumber