Artikola Adresaro
MySQL-datumbazoTransakcia rollback izolado/malferma koncepto/nivela prilaborado php-deklaro
MySQL Aferoj
MySQL-transakcioj estas ĉefe uzataj por prilabori datumojn kun granda kvanto da operacioj kaj alta komplekseco.Ekzemple, en la sistemo de administrado de dungitaro, se vi forigas personon, vi devas forigi kaj la bazajn informojn de la persono kaj la informojn rilatajn al la persono, kiel leterkestoj, artikoloj, ktp. Tiamaniere, ĉi tiuj datumbazaj operaciaj deklaroj konsistigu transakcion!
- Transakcioj estas subtenataj en MySQL nur por datumbazoj aŭ tabeloj, kiuj uzas la datumbazan motoron Innodb.
- Transakcia pretigo povas esti uzita por konservi la integrecon de la datumbazo, certigante ke aroj de SQL-deklaroj estas aŭ ĉiuj efektivigitaj aŭ neniu el ili estas efektivigita.
- Transakcioj estas uzataj por administri enmeti, ĝisdatigi, forigi deklarojn
Ĝenerale, transakcio devas plenumi 4 kondiĉojn (ACIDO): Atomiko (atomiko), Konsistenco (stabileco), Izoliĝo (izolado), Fortikeco (fidindeco)
- 1 、Atomiko de transakcioj:Aro da transakcioj, kiuj aŭ sukcesas aŭ retiriĝas.
- 2 、stabileco:Estas kontraŭleĝaj datumoj (fremdaj ŝlosilaj limoj kaj similaj), kaj la transakcio estas retirita.
- 3 、Izolo:Transakcioj funkcias sendepende.Se la rezulto de transakcio influas aliajn transakciojn, tiam aliaj transakcioj estos retiritaj.100% izolado de transakcioj koste de rapideco.
- 4 、fidindeco:Post la kraŝo de programaro kaj aparataro, la ŝoforo de la datumtabelo de InnoDB uzos la protokoldosieron por rekonstrui kaj modifi ĝin.Fidindeco kaj alta rapido ne povas havi ambaŭ, la opcio innodb_flush_log_at_trx_commit determinas kiam konservi transakciojn al la protokolo.
Sub la defaŭltaj agordoj de la komandlinio MySQL, transakcioj estas aŭtomate faritaj, tio estas, la operacio COMMIT estos efektivigita tuj post kiam la SQL-deklaro estas ekzekutita.Tial, por eksplicite malfermi transakcion devas uzi la komandon BEGIN aŭ START TRANSACTION, aŭ ekzekuti la komandon SET AUTOCOMMIT=0, por malŝalti la uzon de aŭtomata kommit por la nuna sesio.
Deklaro pri kontrolo de transakcioj:
- KOMENCI aŭ KOMENCI TRANSAKTON; eksplicite komenci transakcion;
- COMMIT; COMMIT LABORO ankaŭ povas esti uzata, sed la du estas ekvivalentaj. COMMIT transigas la transakcion kaj faras ĉiujn modifojn faritajn al la datumbazo konstantaj;
- ROLLBACK; eblas uzi ROLLBACK WORK, sed la du estas ekvivalentaj.Rollback finas la transakcion de la uzanto kaj malfaras ĉiujn neengaĝitajn modifojn en progreso;
- SAVEPOINT-identigilo; SAVEPOINT permesas krei savpunkton en transakcio, kaj povas ekzisti pluraj SAVEPOINT-oj en transakcio;
- RELEASE SAVEPOINT-identigilo; forigu savpunkton de transakcio, kiam ne estas specifita savpunkto, ekzekuti la deklaron ĵetos escepton;
- ROLLBACK TO identigilon; reiru la transakcion al la punkto;
- AJRI TRANSAKTION; uzata por agordi la izolitecan nivelon de la transakcio. La transakciaj izolaj niveloj provizitaj de la InnoDB-stoka motoro estas LEGATA NEENGAGITA, LEGADA FELIGA, RIPETEBLE LEGATA kaj SERIALIZA.
Estas du ĉefaj metodoj de MYSQL-transakciopretigo:
1. Uzu BEGIN, ROLLBACK, COMMIT por atingi
- BEGINO komenci transakcion
- RETROVENO transakcia retroiro
- KOMISI Konfirmo de transakcio
2. Uzu SET rekte por ŝanĝi la aŭtomateman reĝimon de MySQL:
- MENU AUTOCOMMIT=0 Malebligu aŭtomatan transdonon
- MENU AUTOCOMMIT=1 Ŝaltu aŭtomatan komiton
transakcia testo
mysql> use chenweiliang; Database changed mysql> CREATE TABLE chenweiliang_transaction_test( id int(5)) engine=innodb; # 创建数据表 Query OK, 0 rows affected (0.04 sec) mysql> select * from chenweiliang_transaction_test; Empty set (0.01 sec) mysql> begin; # 开始事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into chenweiliang_transaction_test value(5); Query OK, 1 rows affected (0.01 sec) mysql> insert into chenweiliang_transaction_test value(6); Query OK, 1 rows affected (0.00 sec) mysql> commit; # 提交事务 Query OK, 0 rows affected (0.01 sec) mysql> select * from chenweiliang_transaction_test; +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.01 sec) mysql> begin; # 开始事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into chenweiliang_transaction_test values(7); Query OK, 1 rows affected (0.00 sec) mysql> rollback; # 回滚 Query OK, 0 rows affected (0.00 sec) mysql> select * from chenweiliang_transaction_test; # 因为回滚所以数据没有插入 +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.01 sec) mysql>
Uzante Transakciajn Kazojn en PHP
MySQL MENDU PER testo:
<? php $dbhost = 'localhost:3306'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn, "set names utf8"); mysqli_select_db( $conn, 'chenweiliang' ); mysqli_query($conn, "SET AUTOCOMMIT=0"); // 设置为不自动提交,因为MYSQL默认立即执行 mysqli_begin_transaction($conn); // 开始事务定义 if(!mysqli_query($conn, "insert into chenweiliang_transaction_test (id) values(8)")) { mysqli_query($conn, "ROLLBACK"); // 判断当执行失败时回滚 } if(!mysqli_query($conn, "insert into chenweiliang_transaction_test (id) values(9)")) { mysqli_query($conn, "ROLLBACK"); // 判断执行失败时回滚 } mysqli_commit($conn); //执行事务 mysqli_close($conn); ?>
Hope Chen Weiliang Blogo ( https://www.chenweiliang.com/ ) kunhavis "MySQL-datumbaza transakcio-revalidigo-izolado/malferma koncepto/nivela pretigo de PHP-deklaroj", kio estas helpema al vi.
Bonvenon dividi la ligon de ĉi tiu artikolo:https://www.chenweiliang.com/cwl-494.html
Bonvenon al la Telegram-kanalo de la blogo de Chen Weiliang por ricevi la plej novajn ĝisdatigojn!
📚 Ĉi tiu gvidilo enhavas grandegan valoron, 🌟Ĉi tio estas malofta ŝanco, ne maltrafu ĝin! ⏰⌛💨
Kunhavigu kaj ŝatu se vi ŝatas!
Via kundivido kaj ŝatoj estas nia kontinua instigo!