INSERT'ler otomatik taahhüt altına giriyor mu?


13

Uygulamamız MySQL Veritabanına kayıt eklemek için bir INSERT sorgusu başlatır. Kayıtların otomatik olarak işlenip işlenmediğini bilmek istiyorum. ROLLBACK komutunu çalıştırırsam, veritabanı ne zaman bir geri alma gerçekleştirir? KOMİTEDEN sonra GERİ ALMA mümkün mü?


Sadece açıklama için, 19 saat önce InnoDB COMMIT / ROLLBACK kullandığından 'innodb' olarak etiketledim.
RolandoMySQLDBA

Bu, Geliştiricilere ve DBA'lara işlemsel davranışlara, işlemleri destekleyen karşılık gelen uygulama paradigmalarına ve sonuçlarına (iyi veya kötü) dikkat etmelerini hatırlatmak için +1 alır.
RolandoMySQLDBA

Sorunuzu cevabımın altındaki bir yorumla cevapladım.
RolandoMySQLDBA

Yanıtlar:


10

Sorunuzun cevabı, birden fazla ifadeye yayılacak bir işlemin içinde olup olmadığınıza bağlıdır. (Soruyu InnoDB ile etiketlediniz, cevap MyISAM ile farklı olacaktır.)

Referans kılavuzundan: http://dev.mysql.com/doc/refman/5.1/en/commit.html

Varsayılan olarak, MySQL otomatik taahhüt modu etkinken çalışır. Bu, bir tabloyu güncelleyen (değiştiren) bir ifadeyi yürüttüğünüz anda MySQL'in güncellemeyi kalıcı hale getirmek için diskte sakladığı anlamına gelir.

Bu nedenle evet, varsayılan olarak, yalnızca kullanıyorsanız INSERT, eklediğiniz kayıtlar işlenecektir ve bunları geri almaya çalışmanın bir anlamı yoktur. (Bu, etkili bir şekilde her ifadeyi BEGINve arasında kaydırmakla aynıdır COMMIT.)

Bununla birlikte, işlemlerle açıkça ilgileniyorsanız COMMIT, kayıtları saklamak için kullanmanız gerekecek, ancak kullanabileceksiniz ROLLBACK.

Bir işlemi START TRANSACTION(veya BEGIN) kullanarak açıkça başlatabilirsiniz . Bu autocommitayardan bağımsızdır (varsayılan olarak açık):

İŞLEMİ BAŞLAT seçeneğinde, siz COMMIT veya ROLLBACK ile işlem bitene kadar otomatik taahhüt devre dışı kalır. Otomatik devreye alma modu daha sonra önceki durumuna geri döner.

Alternatif olarak, eğer autocommit=0, işlemin başka bir sonunu izleyen herhangi bir ifade, bir işlem başlatacağını düşünüyorum (ama yine de START TRANSACTIONaçıkça kullanabilirsiniz ); en azından bunu yorumlamamın yolu :

Otomatik devreye alma modu. 1 olarak ayarlanırsa, tablodaki tüm değişiklikler hemen geçerli olur. 0 olarak ayarlanırsa, bir işlemi kabul etmek için COMMIT veya iptal etmek için ROLLBACK kullanmalısınız. Otomatik taahhüt 0 ise ve bunu 1 olarak değiştirirseniz, MySQL herhangi bir açık işlemin otomatik COMMIT'ini gerçekleştirir. Bir işleme başlamanın başka bir yolu da bir START TRANSACTION veya BEGIN deyimi kullanmaktır. Bkz. Bölüm 12.3.1, “İŞLEMİ BAŞLAT, KOMİTE VE GERİ BESLEME Sözdizimi”.

Daha spesifik olarak "bir işleme başlamanın başka bir yolu", "autocommit = 0" ayarının bir işlemi başlatmak için yeterli olduğu anlamına gelir (en azından bir oturumun başlangıcındaki her bir ifadeden hemen önce veya COMMIT/ öğesini izleyen ROLLBACK). İşlemin ne zaman başladığını veya bittiğini görmeyi daha net hale getirebileceğinden bile , açıkça BEGINveya START TRANSACTIONyine de kullanmanızı öneririm autocommit=0.

(Bir işlemi nasıl başlatacağınız, uygulamanızın MySQL'i kullanma şekline bağlı olabilir.)


1
İşlem protokollerini tam olarak tanımlamak için + 1'i hak eder.
RolandoMySQLDBA

@Bruno, "Taahhüt" ve "geri alma" işlevlerinin çalışmadığı MyISAM için, ekler yarı işlenemez mi?
Pacerier

7

Varsayılan olarak, InnoDB autocommit = 1 veya ON olarak ayarlanmıştır . Bir kez taahhüt edildiğinde, geri alınamazlar .

İleride devre dışı bırakmak için iki şeyden birini yapmanız gerekir:

SEÇENEK 1: Bunu /etc/my.cnf dosyasına ekleyin ve mysql'yi yeniden başlatın

[mysqld]
autocommit=0

SEÇENEK 2: Herhangi bir anlamlı SQL'e başlamadan önce bunlardan birini açık DB Conenction'da gerçekleştirin

SET autocommit = 0;
START TRANSACTION;

Bu iki seçenek altında, bir manuel COMMIT veya bir manuel ROLLBACK gerçekleştirmeniz gerekir .

UYARI

Tablo MyISAM ise, açıklama daha basittir. MyISAM depolama motoru için herhangi bir işlem olmadığından, yürütülen tüm INSERT'ler, UPDATE'ler ve DELETE'ler kalıcıdır. Herhangi bir geri dönüş yok.


Daha fazla açıklama için cevabım hem InnoDB hem de MyISAM depolama motorlarını ele alıyor.
RolandoMySQLDBA

1
InnoDB'de Otomatik Tamamlama KAPALI ise ve uygulamam Sorgu Ekle'yi çalıştırıyorsa ve Tamamlama işlemini yürütmeyi unutursam, değişiklikler ne kadar sürede kaybedilir?
RPK

Uygulamanız her INSERT'ten sonra manuel olarak bir KOMİT atarsa, yazılıdır ve silinemez. DB Bağlantısı siz COMMIT öncesinde ölürse, tüm değişiklikler kaybolur ve geri alma gerçekleşir. Herhangi bir DDL (CREATE TABLE, DROP TABLE, ALTER TABLE, vb.) Gerçekleştirir veya el ile bir tablo kilidi düzenlerseniz, INSERT'ler otomatik olarak atanır. İŞLEMİ BAŞLAT seçeneğini kullanırsanız, taahhüt edilmemiş tüm değişiklikler yapılır.
RolandoMySQLDBA

1
"İŞLEMİ BAŞLAT seçeneğini kullanırsanız, taahhüt edilmemiş tüm değişiklikler yapılır." (DDL'lerin bağlamında, aksi takdirde geri alınır), daha önce de örtülü bir taahhüt vardır (bundan sonraki örtük taahhüt belgelere göre 5.5.3 sürümündedir).
Bruno

1
"İŞLEMİ BAŞLAT seçeneğini kullanırsanız, taahhüt edilmemiş tüm değişiklikler yapılır." - Bu fikri MySQL 5.0 Sertifikasyon Çalışma Kılavuzu'ndan (ISBN 0-672-32812-7) başlatacağım. BAŞLANGIÇ İŞLEMİ, SET AUTOCOMMIT = 1, KİLİT TABLOLARI, KİLİT TABLOLARI, TRUNCATE TABLE, RENAME TABLE, DROP INDEX, DROP TABLE , DROP DATABASE, CREATE INDEX, BEGIN ve ALTER TABLE başlıkları altında "Bazı durumlarda, geçerli işlem örtük olarak sona erebilir: Aşağıdaki ifadelerden herhangi birini verirseniz, InnoDB geçerli işlemin önceki taahhüt edilmemiş ifadelerini örtük olarak taahhüt eder ve bir yeni işlem ".
RolandoMySQLDBA
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.