Heim > Datenbank > MySQL-Tutorial > Detaillierte Einführung in die Transaktionsverarbeitung in MySQL

Detaillierte Einführung in die Transaktionsverarbeitung in MySQL

黄舟
Freigeben: 2017-08-20 15:41:24
Original
1571 Leute haben es durchsucht

Was ist Transaktionsverarbeitung? ? Die Transaktionsverarbeitung wird verwendet, um die Integrität der Datenbank aufrechtzuerhalten. Sie stellt sicher, dass Stapel von MySQL-Operationen entweder vollständig ausgeführt werden oder nicht.

1. MySQL-Transaktionskonzept

MySQL-Transaktionen werden hauptsächlich zur Verarbeitung von Daten mit großen Vorgängen und hoher Komplexität verwendet. Eine logische Ausführungseinheit besteht aus einer oder mehreren Datenbankoperationssequenzen. Diese Reihe von Operationen wird entweder vollständig ausgeführt oder die gesamte Ausführung wird abgebrochen. In MySQL unterstützen nur Datenbanken oder Tabellen, die die Innodb-Datenbank-Engine verwenden, Transaktionen. Transaktionen werden zum Verwalten von Einfüge-, Aktualisierungs- und Löschanweisungen verwendet.

2. Transaktionsmerkmale: Atomizität (Atomizität), Konsistenz (Stabilität, Konsistenz), Isolation (Isolation) und Haltbarkeit (Kontinuität, Zuverlässigkeit). Diese vier Eigenschaften werden auch als ACID-Eigenschaften bezeichnet.

1. Atomarität: Eine Transaktion ist die kleinste Ausführungseinheit in einer Anwendung, genau wie ein Atom das kleinste Teilchen in der Natur ist und die Eigenschaft hat, unteilbar zu sein. Eine Transaktion ist der kleinste logische Ausführungskörper, der in einer Anwendung nicht aufgeteilt werden kann. Eine Gruppe von Transaktionen kann entweder erfolgreich sein oder zurückgezogen werden.

2. Stabilität und Konsistenz: Das Ergebnis der Transaktionsausführung muss die Datenbank von einem Konsistenzzustand in einen anderen Konsistenzzustand ändern. Eine Datenbank befindet sich in einem konsistenten Zustand, wenn sie nur die Ergebnisse erfolgreich festgeschriebener Transaktionen enthält. Konsistenz wird durch Atomizität gewährleistet. Es liegen illegale Daten vor (Fremdschlüsselbeschränkungen usw.) und die Transaktion wird zurückgezogen.

3. Isolation: Die Ausführung jeder Transaktion beeinträchtigt sich nicht gegenseitig und die internen Vorgänge jeder Transaktion sind von anderen gleichzeitigen Transaktionen isoliert. Das heißt: Gleichzeitig ausgeführte Transaktionen können den Zwischenstatus der anderen nicht sehen und gleichzeitig ausgeführte Transaktionen können sich nicht gegenseitig beeinflussen. Transaktionen laufen unabhängig ab. Wenn sich das Ergebnis einer Transaktion auf andere Transaktionen auswirkt, werden die anderen Transaktionen zurückgezogen. Eine 100-prozentige Isolierung von Transaktionen erfordert Einbußen bei der Geschwindigkeit.

4. Kontinuität, Zuverlässigkeit: Kontinuität, auch Dauerhaftigkeit genannt, bedeutet, dass nach der Übermittlung einer Transaktion alle an den Daten vorgenommenen Änderungen dauerhaft gespeichert werden müssen, normalerweise in einer physischen Datenbank. Nach einem Software- oder Hardware-Absturz verwendet der InnoDB-Datentabellentreiber die Protokolldatei, um sie zu rekonstruieren und zu ändern. Zuverlässigkeit und hohe Geschwindigkeit sind nicht kompatibel. Die Option innodb_flush_log_at_trx_commit bestimmt, wann Transaktionen im Protokoll gespeichert werden.

Hinweis: Die Speicher-Engine MyISAM unterstützt keine Transaktionen, die Speicher-Engine InnoDB unterstützt jedoch Transaktionen. Transaktionen sind nur für Anweisungen gültig, die sich auf Daten auswirken. show engine Zeigt die von MySQL Lock unterstützten Daten-Engines an.

3. Konzept des Lesens von Daten

1. Dirty Read: Der sogenannte Dirty Read ist das Lesen von Dirty Data, und Dirty Data bezieht sich auf Es ist nicht festgeschrieben Daten. Eine Transaktion ändert einen Datensatz, bevor die Transaktion abgeschlossen und festgeschrieben wird. Zu diesem Zeitpunkt werden die nicht festgeschriebenen Daten von einer zweiten Transaktion gelesen generiert nicht festgeschriebene Datenabhängigkeiten. Dieses Phänomen wird Dirty Reading genannt.

2. Nicht wiederholbare Lesevorgänge: Eine Transaktion liest denselben Datensatz nacheinander, aber die zweimal gelesenen Daten sind unterschiedlich. Wir nennen es nicht wiederholbare Lesevorgänge. Mit anderen Worten: Die Daten wurden zwischen den beiden Lesevorgängen dieser Transaktion durch andere Transaktionen geändert.

3. Phantom-Lesevorgänge: Eine Transaktion liest zuvor abgerufene Daten gemäß denselben Abfragebedingungen erneut, stellt jedoch fest, dass andere Transaktionen neue Daten eingefügt haben, die ihre Abfragebedingungen erfüllen. Dieses Phänomen wird als „Phantom-Lesen“ bezeichnet.

4. Transaktionsisolationsstufe

Ändern Sie die Syntax der Transaktionsisolationsstufe:

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
Nach dem Login kopieren

1. Nicht festgeschrieben lesen (nicht autorisiertes Lesen) , nicht festgeschrieben lesen): Dies ist die niedrigste Isolationsstufe, die es anderen Transaktionen ermöglicht, nicht festgeschriebene Daten zu sehen. Diese Ebene kann zu Dirty Reads führen. Wenn eine Transaktion mit dem Schreiben von Daten begonnen hat, darf eine andere Transaktion nicht gleichzeitig Daten schreiben, andere Transaktionen dürfen jedoch diese Datenzeile lesen. Diese Isolationsstufe kann durch eine „exklusive Schreibsperre“ erreicht werden. Aktualisierungsverluste werden vermieden, es kann jedoch zu fehlerhaften Lesevorgängen kommen. Mit anderen Worten: Transaktion B hat die nicht festgeschriebenen Daten von Transaktion A gelesen. Die SELECT-Anweisung wird nicht sperrend ausgeführt, sodass fehlerhafte Daten gelesen werden können und die Isolationsstufe die niedrigste ist.


SET session transaction isolation level read uncommitted ;
SET global transaction isolation level read uncommitted;/*全局建议不用*/
SELECT @@global.tx_isolation;
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;
Nach dem Login kopieren

Erstellen Sie eine einfache Schülertabelle, legen Sie die Felder ID, Name und Nummer fest, starten Sie Transaktion 1, fügen Sie die Tabelle zur gespeicherten Prozedur hinzu, die Transaktion ist nicht vorhanden Eingereicht, zeigen Sie den aktuellen Datenbanktransaktionsstatus an, Sie können eine Datentransaktion sehen, die Transaktionsebene ist READ UNCOMMITTED:


drop table if exists student;
create table student(
id int primary key auto_increment comment 'id',
name varchar(100) comment '名称',
num int
);
drop procedure if exists proc_on_sw;
delimiter ;;
create procedure proc_on_sw()
begin
start transaction;
insert into student(name,num) value('aaa',1);
select * from information_schema.INNODB_TRX;
end
;;
delimiter ;;
call proc_on_sw();
Nach dem Login kopieren

Erstellen Sie eine neue Transaktion 2, fragen Sie den Schüler ab In der Tabelle befinden wir uns auf der Ebene READ UNCOMMITTED. Sie können nicht festgeschriebene Daten aus anderen Transaktionen sehen: Überprüfen Sie den Datenbanktransaktionsstatus erneut, und wir werden sehen, dass der Status normal ist.


start transaction ;
select * from student;
commit;
select * from information_schema.INNODB_TRX;
Nach dem Login kopieren

2. Read Committed (autorisiertes Lesen, Read Commit): Die Transaktion, die die Daten liest, ermöglicht es anderen Transaktionen, weiterhin auf die Datenzeile zuzugreifen, jedoch nicht festgeschrieben schreibt Die Transaktion verhindert, dass andere Transaktionen auf die Zeile zugreifen. Diese Isolationsstufe vermeidet schmutzige Lesevorgänge, es können jedoch nicht wiederholbare Lesevorgänge auftreten. Transaktion A liest die Daten im Voraus, Transaktion B aktualisiert die Daten und schreibt die Transaktion fest. Wenn Transaktion A die Daten erneut liest, haben sich die Daten geändert.


SET session transaction isolation level read committed ;
SET global transaction isolation level read committed; /*全局建议不用*/

drop procedure if exists proc_on_up;
delimiter ;;
create procedure proc_on_up()
begin
set autocommit=0;
update student set name='cc' where id=1;
commit;
set autocommit=1;
end
;;
delimiter ;;
call proc_on_up();
select * from student;
Nach dem Login kopieren


  3.repeatable read(可重复读取):就是在开始读取数据(事务开启)时,不再允许修改操作,事务开启,不允许其他事务的UPDATE修改操作,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。避免了不可重复读取和脏读,但是有时可能出现幻读。这可以通过“共享读锁”和“排他写锁”实现。

set session transaction isolation level repeatable read;
Nach dem Login kopieren

  4.串行化、序列化:提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。

set session transaction isolation level serializable;
Nach dem Login kopieren

      隔离等级   脏读   不可重复读   幻读
      读未提交   YES   YES      YES
      读已提交   NO    YES      YES
      可重复读   NO    NO      YES
      串行化    NO    NO       NO

五、完整例子包括提交和回滚完整例子


drop procedure if exists pro_new;
delimiter;;
create procedure pro_new(out rtn int)
begin
declare err INT default 0;
-- 如果出现异常,会自动处理并rollback
declare exit handler for sqlexception ROLLBACK ; 
-- 启动事务
set autocommit=0;
start transaction;
insert into student(name,num) values(NULL,2.3);
-- set err = @@IDENTITY; -- =  获取上一次插入的自增ID;
set err =last_insert_id(); -- 获取上一次插入的自增ID
insert into student(name,num) VALUEs('ccc',err);
-- 运行没有异常,提交事务
commit;
-- 设置返回值为1
set rtn=1;
set autocommit=1;
end
;;
delimiter ;;
set @n=1;
call pro_new(@n);
select @n;
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Transaktionsverarbeitung in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage