Director articol
Baza de date MySQLIzolarea tranzacției rollback/concept deschis/procesare la nivel de instrucțiune php
MySQL Afaceri
Tranzacțiile MySQL sunt utilizate în principal pentru a procesa date cu un număr mare de operațiuni și complexitate ridicată.De exemplu, în sistemul de management al personalului, dacă ștergeți o persoană, trebuie să ștergeți atât informațiile de bază ale persoanei, cât și informațiile legate de persoana respectivă, cum ar fi cutiile poștale, articolele etc. În acest fel, aceste instrucțiuni de operare a bazei de date constituie o tranzacție!
- Tranzacțiile sunt acceptate în MySQL numai pentru bazele de date sau tabele care utilizează motorul de baze de date Innodb.
- Procesarea tranzacțiilor poate fi utilizată pentru a menține integritatea bazei de date, asigurându-se că loturile de instrucțiuni SQL sunt fie executate în totalitate, fie că niciuna dintre ele nu este executată.
- Tranzacțiile sunt folosite pentru a gestiona inserarea, actualizarea, ștergerea extraselor
În general, tranzacțiile trebuie să îndeplinească 4 condiții (ACID): Atomicitate (atomicitate), Consistență (stabilitate), Izolare (izolare), Durabilitate (fiabilitate)
- 1,Atomicitatea tranzacțiilor:Un set de tranzacții care fie reușesc, fie se retrag.
- 2,stabilitate:Există date ilegale (constrângeri de cheie străină și altele asemenea), iar tranzacția este retrasă.
- 3,Izolare:Tranzacțiile rulează independent.Dacă rezultatul unei tranzacții afectează alte tranzacții, atunci celelalte tranzacții vor fi retrase.Izolarea 100% a tranzacțiilor în detrimentul vitezei.
- 4,fiabilitate:După blocarea software-ului și a hardware-ului, driverul tabelului de date InnoDB va folosi fișierul jurnal pentru a-l reconstrui și a-l modifica.Fiabilitatea și viteza mare nu pot avea ambele, opțiunea innodb_flush_log_at_trx_commit determină când să salveze tranzacțiile în jurnal.
Sub setările implicite ale liniei de comandă MySQL, tranzacțiile sunt comise automat, adică operația COMMIT va fi executată imediat după executarea instrucțiunii SQL.Prin urmare, pentru a deschide în mod explicit o tranzacție, trebuie să utilizați comanda BEGIN sau START TRANSACTION, sau să executați comanda SET AUTOCOMMIT=0, pentru a dezactiva utilizarea commitării automate pentru sesiunea curentă.
Declarație de control al tranzacțiilor:
- ÎNCEPE sau ÎNCEPE TRANZACȚIA; începe explicit o tranzacție;
- Se poate folosi și COMMIT; COMMIT WORK, dar cele două sunt echivalente. COMMIT comite tranzacția și face permanente toate modificările aduse bazei de date;
- ROLLBACK; este posibil să utilizați ROLLBACK WORK, dar cele două sunt echivalente.Rollback încheie tranzacția utilizatorului și anulează orice modificări necommitate în curs;
- Identificator SAVEPOINT; SAVEPOINT permite crearea unui punct de salvare într-o tranzacție și pot exista mai multe SAVEPOINT-uri într-o tranzacție;
- RELEASE SAVEPOINT identificator; șterge un punct de salvare al unei tranzacții, când nu există un punct de salvare specificat, executarea instrucțiunii va arunca o excepție;
- ROLLBACK TO identificator; rulează înapoi tranzacția la punct;
- SET TRANZACȚIE; folosit pentru a seta nivelul de izolare al tranzacției. Nivelurile de izolare a tranzacțiilor furnizate de motorul de stocare InnoDB sunt READ NECOMMITTED, READ COMMITTED, REPEATABLE READ și SERIALIZABLE.
Există două metode principale de procesare a tranzacțiilor MYSQL:
1. Folosiți BEGIN, ROLLBACK, COMMIT pentru a obține
- ÎNCEPE începe o tranzacție
- REALIZARE returnarea tranzacției
- COMITEAZA Confirmarea tranzacției
2. Utilizați SET direct pentru a schimba modul de confirmare automată a MySQL:
- SETAUTOCOMMIT=0 Dezactivează auto-commit
- SETAUTOCOMMIT=1 Activați auto-commit
testul tranzacției
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>
Utilizarea instanțelor de tranzacție în PHP
MySQL ORDER BY test:
<?
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 Blog ( https://www.chenweiliang.com/ ) a împărtășit „Izolarea inversării tranzacțiilor în baza de date MySQL/Concept deschis/Procesarea la nivel a instrucțiunilor PHP”, ceea ce vă este util.
Bine ați venit să distribuiți linkul acestui articol:https://www.chenweiliang.com/cwl-494.html
Pentru a debloca mai multe trucuri ascunse🔑, te invităm să te alături canalului nostru de Telegram!
Distribuie si da like daca iti place! Share-urile și like-urile tale sunt motivația noastră continuă!