English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

事务 MySQL

MySQL Transazioni viene utilizzato principalmente per gestire dati ad alta quantità e complessità. Ad esempio, nel sistema di gestione delle persone, quando elimini una persona, devi eliminare non solo le informazioni di base della persona, ma anche le informazioni correlate alla persona, come le caselle postali, gli articoli, ecc., così queste operazioni di database formano una transazione!

  • In MySQL, solo i database o le tabelle che utilizzano il motore di database Innodb supportano le transazioni.

  • Il trattamento delle transazioni può essere utilizzato per mantenere l'integrità del database, garantendo che le istruzioni SQL in blocco vengano eseguite o non eseguite.

  • La transazione viene utilizzata per gestire le istruzioni insert,update,delete

In generale, una transazione deve soddisfare 4 condizioni (ACID): Atomicity (AAtomicity, o noto come indivisibilità), Coerenza (CConsistency), Isolation (IIsolation, anche conosciuta come indipendenza), Durability (DDurability).

  • Atomicità:Tutte le operazioni in una transazione (transaction) devono essere completate o non completate, non possono essere interrotte a metà. Se si verifica un errore durante l'esecuzione della transazione, verrà ripulito (Rollback) allo stato iniziale della transazione, come se questa transazione non fosse mai stata eseguita.

  • Coerenza:Prima dell'inizio della transazione e dopo la fine della transazione, l'integrità del database non è stata danneggiata. Questo significa che i dati inseriti devono conformarsi completamente a tutte le regole predefinite, inclusi l'accuratezza dei dati, la coerenza e la capacità del database di completare automaticamente il lavoro pianificato.

  • Isolamento:Il database ha la capacità di leggere e scrivere e modificare i dati contemporaneamente durante la transazione concorrente, e l'isolamento può prevenire che le transazioni eseguite in parallelo causino l'不一致ità dei dati a causa dell'esecuzione incrociata. L'isolamento delle transazioni è diviso in diversi livelli, inclusi Read uncommitted (Read non confermato), Read committed (Read confermato), Repeatable read (Leggibile ripetibile) e Serializable (Serializzabile).

  • Persistence:Dopo la conclusione del trattamento delle transazioni, le modifiche ai dati sono permanenti, anche se il sistema va in guasto non saranno perse.

Sotto la configurazione predefinita della riga di comando MySQL, le transazioni sono automaticamente commit, ovvero viene eseguito l'operazione COMMIT immediatamente dopo l'esecuzione dell'istruzione SQL. Pertanto, per aprire esplicitamente una transazione, è necessario utilizzare il comando BEGIN o START TRANSACTION, o eseguire il comando SET AUTOCOMMIT=0 per disabilitare l'uso del commit automatico della sessione corrente.

istruzioni di controllo delle transazioni:

  • BEGIN o START TRANSACTION apre esplicitamente una transazione;

  • COMMIT può anche utilizzare COMMIT WORK, ma i due sono equivalenti. COMMIT conferma la transazione e rende permanenti tutte le modifiche apportate al database;

  • ROLLBACK può anche utilizzare ROLLBACK WORK, ma i due sono equivalenti. Il rollback termina la transazione dell'utente e annulla tutte le modifiche non confermate in corso;

  • SAVEPOINT identifier, il punto di salvataggio consente di creare un punto di salvataggio all'interno di una transazione, una transazione può avere più punti di salvataggio;

  • RELEASE SAVEPOINT identifier elimina un punto di salvataggio della transazione, quando non viene specificato un punto di salvataggio, l'esecuzione di questa istruzione genererà un'eccezione;

  • ROLLBACK TO identifier rolla indietro la transazione al punto di marchio;

  • SET TRANSACTION viene utilizzato per impostare il livello di isolamento della transazione. Il motore di archiviazione InnoDB fornisce livelli di isolamento delle transazioni READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ e SERIALIZABLE.

Il trattamento delle transazioni MYSQL ha principalmente due metodi:

1、realizzare con BEGIN, ROLLBACK, COMMIT

  • BEGIN iniziare una transazione

  • ROLLBACK rollback della transazione

  • COMMIT  conferma della transazione

2、modificare direttamente il modello di trasmissione automatica di MySQL con SET:

  • SET AUTOCOMMIT=0   disabilitare la trasmissione automatica

  • SET AUTOCOMMIT=1 attivare la trasmissione automatica

mysql> use w3codebox;
Database modificato
mysql> CREATE TABLE w3codebox_transaction_test(id int(5)) engine=innodb; # Creare tabella dati
Query OK, 0 righe influenzate (0.04 sec)
 
mysql> select * from w3codebox_transaction_test;
insieme vuoto (0.01 sec)
 
mysql> begin; # 开始事务
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into w3codebox_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
 
mysql> insert into w3codebox_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 w3codebox_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 w3codebox_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 w3codebox_transaction_test; # 因为回滚所以数据没有插入
+------+
| id      |
+------+
| 5      |
| 6      |
+------+
2 rows in set (0.01 sec)
 
mysql>

PHP中使用事务示例

<?php
$dbhost = 'localhost'; // 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, 'w3codebox');
mysqli_query($conn, "SET AUTOCOMMIT=0"); // 设置为不自动提交,因为MYSQL默认立即执行
mysqli_begin_transaction($conn); // 开始事务定义
 
if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values(8)"))
{
    mysqli_query($conn, "ROLLBACK"); // 判断当执行失败时回滚
}
 
if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values(9)"))
{
    mysqli_query($conn, "ROLLBACK"); // 判断执行失败时回滚
}
mysqli_commit($conn); // 执行事务
mysqli_close($conn);
?>