MySQL 事務(wù)
???? 在 MySQL 中只有使用了 Innodb 數(shù)據(jù)庫引擎的數(shù)據(jù)庫或表才支持事務(wù)。
???? 事務(wù)處理可以用來維護(hù)數(shù)據(jù)庫的完整性,保證成批的 SQL 語句要么全部執(zhí)行,要么全部不執(zhí)行。
事務(wù)用來管理 insert,update,delete 語句
??? 1、事務(wù)的原子性:一組事務(wù),要么成功;要么撤回。
??? 2、穩(wěn)定性 :有非法數(shù)據(jù)(外鍵約束之類),事務(wù)撤回。
??? 3、隔離性:事務(wù)獨(dú)立運(yùn)行。一個(gè)事務(wù)處理后的結(jié)果,影響了其他事務(wù),那么其他事務(wù)會撤回。事務(wù)的100%隔離,需要犧牲速度。
???? 4、可靠性:軟、硬件崩潰后,InnoDB數(shù)據(jù)表驅(qū)動會利用日志文件重構(gòu)修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit 選項(xiàng) 決定什么時(shí)候吧事務(wù)保存到日志里。
???? 在 MySQL 命令行的默認(rèn)設(shè)置下,事務(wù)都是自動提交的,即執(zhí)行 SQL 語句后就會馬上執(zhí)行 COMMIT 操作。因此要顯式地開啟一個(gè)事務(wù)務(wù)須使用命令 BEGIN 或 START TRANSACTION,或者執(zhí)行命令 SET AUTOCOMMIT=0,用來禁止使用當(dāng)前會話的自動提交。
事務(wù)控制語句:
???????? BEGIN或START TRANSACTION;顯式地開啟一個(gè)事務(wù);
??????? COMMIT;也可以使用COMMIT WORK,不過二者是等價(jià)的。COMMIT會提交事務(wù),并使已對數(shù)據(jù)庫進(jìn)行的所有修改稱為永久性的;
??????? ROLLBACK;有可以使用ROLLBACK WORK,不過二者是等價(jià)的?;貪L會結(jié)束用戶的事務(wù),并撤銷正在進(jìn)行的所有未提交的修改;
?????? SAVEPOINT identifier;SAVEPOINT允許在事務(wù)中創(chuàng)建一個(gè)保存點(diǎn),一個(gè)事務(wù)中可以有多個(gè)SAVEPOINT;
??????? RELEASE SAVEPOINT identifier;刪除一個(gè)事務(wù)的保存點(diǎn),當(dāng)沒有指定的保存點(diǎn)時(shí),執(zhí)行該語句會拋出一個(gè)異常;
??????? ROLLBACK TO identifier;把事務(wù)回滾到標(biāo)記點(diǎn);
???????? SET TRANSACTION;用來設(shè)置事務(wù)的隔離級別。InnoDB存儲引擎提供事務(wù)的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
MYSQL 事務(wù)處理主要有兩種方法:
1、用 BEGIN, ROLLBACK, COMMIT來實(shí)現(xiàn)
??? BEGIN 開始一個(gè)事務(wù)
???? ROLLBACK 事務(wù)回滾
???? COMMIT 事務(wù)確認(rèn)
2、直接用 SET 來改變 MySQL 的自動提交模式:
???????? SET AUTOCOMMIT=0 禁止自動提交
???????? SET AUTOCOMMIT=1 開啟自動提交
yii2.0事物的應(yīng)用
$transaction = Yii::$app->db->beginTransaction();
try?{
??? $connection->createCommand($sql1)->execute();
??? //如果執(zhí)行失敗則拋出錯(cuò)誤
???? if(status?==?false)
????????? throw?new?\Exception('這里是錯(cuò)誤原因');
????????? $connection->createCommand($sql2)->execute();
????????? $transaction->commit();????????????//只有執(zhí)行了commit(),對于上面數(shù)據(jù)庫的操作才會真正執(zhí)行
???? }catch?(Exception?$e)?{
??? $error?=?$e->getMessage();??//獲取拋出的錯(cuò)誤
??? $transaction->rollBack();
}