Artikel Directory
Isolering/aktivering af koncepter/niveauhåndtering af PHP-sætninger i MySQL- databasetransaktioner
MySQL Anliggender
MySQL-transaktioner bruges hovedsageligt til at behandle data med en stor mængde operationer og høj kompleksitet.For eksempel, i personaleledelsessystemet, hvis du sletter en person, skal du slette både de grundlæggende oplysninger om personen og de oplysninger, der er relateret til personen, såsom postkasser, artikler osv. På denne måde vil disse databaseoperationserklæringer udgør en transaktion!
- Transaktioner understøttes kun i MySQL for databaser eller tabeller, der bruger Innodb-databasemotoren.
- Transaktionsbehandling kan bruges til at opretholde databasens integritet og sikre, at batches af SQL-sætninger enten udføres alle sammen, eller ingen af dem udføres.
- Transaktioner bruges til at administrere indsættelse, opdatering og sletning af kontoudtog
Generelt skal en transaktion opfylde 4 betingelser (ACID): Atomicitet (atomicitet), Konsistens (stabilitet), Isolation (isolation), Holdbarhed (pålidelighed)
- 1,Atomicitet af transaktioner:Et sæt transaktioner, der enten lykkes eller trækkes tilbage.
- 2,stabilitet:Der er ulovlige data (fremmednøglebegrænsninger og lignende), og transaktionen trækkes tilbage.
- 3,Isolation:Transaktioner foregår uafhængigt.Hvis resultatet af en transaktion påvirker andre transaktioner, vil andre transaktioner blive trukket tilbage.100% isolering af transaktioner på bekostning af hastighed.
- 4,pålidelighed:Efter software- og hardwarenedbrud vil InnoDB-datatabeldriveren bruge logfilen til at rekonstruere og ændre den.Pålidelighed og høj hastighed kan ikke have begge dele, indstillingen innodb_flush_log_at_trx_commit bestemmer, hvornår transaktioner skal gemmes i loggen.
Under standardindstillingerne på MySQL-kommandolinjen bliver transaktioner automatisk forpligtet, det vil sige, at COMMIT-operationen udføres umiddelbart efter, at SQL-sætningen er udført.Derfor, for eksplicit at åbne en transaktion, skal du bruge kommandoen BEGIN eller START TRANSACTION, eller udføre kommandoen SET AUTOCOMMIT=0, for at deaktivere brugen af automatisk commit for den aktuelle session.
Transaktionskontrolerklæring:
- START eller START TRANSAKTION, start eksplicit en transaktion;
- COMMIT; COMMIT WORK kan også bruges, men de to er ækvivalente. COMMIT forpligter transaktionen og gør alle ændringer i databasen permanente;
- ROLLBACK; det er muligt at bruge ROLLBACK WORK, men de to er ækvivalente.Rollback afslutter brugerens transaktion og fortryder alle igangværende ikke-forpligtede ændringer;
- SAVEPOINT identifikator; SAVEPOINT gør det muligt at oprette et savepoint i en transaktion, og der kan være flere SAVEPOINTs i en transaktion;
- RELEASE SAVEPOINT identifikator; slet et lagringspunkt for en transaktion, når der ikke er noget specificeret lagringspunkt, vil udførelse af sætningen give en undtagelse;
- TILBAGE TIL identifikator, rulle transaktionen tilbage til punktet;
- SET TRANSACTION; bruges til at indstille isolationsniveauet for transaktionen. InnoDB-lagringsmotoren leverer transaktionsisoleringsniveauer af LÆS UNCOMMITTED, LÆS KOMMITTET, LÆS GENTAGELSE og SERIALISERbar.
Der er to hovedmetoder til MYSQL transaktionsbehandling:
1. Brug BEGIN, ROLLBACK, COMMIT for at opnå
- BEGIN starte en transaktion
- RULBACK tilbagerulning af transaktioner
- COMMIT Transaktionsbekræftelse
2. Brug SET direkte til at ændre MySQL's auto-commit-tilstand:
- INDSTIL AUTOKOMMITT=0 Deaktiver automatisk commit
- INDSTIL AUTOKOMMITT=1 Slå auto-commit til
transaktionstest
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>
Brug af transaktionsforekomster i 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);
?>Forhåbentlig vil artiklen "MySQL Database Transaction Rollback Isolation/Enabling Concepts/Level Handling PHP Statements", som er delt på Chen Weiliangs blog ( https://www.chenweiliang.com/ ), være nyttig for dig.
Del gerne dette artikellink: https://www.chenweiliang.com/cwl-494.html
