事物處理

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();

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • MySQL技術(shù)內(nèi)幕:InnoDB存儲引擎(第2版) 姜承堯 第1章 MySQL體系結(jié)構(gòu)和存儲引擎 >> 在上述例子...
    沉默劍士閱讀 7,466評論 0 16
  • 來源轉(zhuǎn)載自:http://www.cnblogs.com/ymy124/p/3718439.html MySQL的...
    Mrwangs閱讀 1,961評論 0 8
  • 為了充分發(fā)揮MySQL的性能并順利地使用,就必須理解其設(shè)計(jì)。MySQL的靈活性體現(xiàn)在很多方面。例如,你可以通過配置...
    李文文丶閱讀 1,233評論 0 4
  • 1、概述 ??事務(wù)是數(shù)據(jù)庫區(qū)別于文件系統(tǒng)的重要特征之一,其用于保證數(shù)據(jù)庫的完整性,事務(wù)能使批量的SQL語句要么完全...
    黒貓閱讀 770評論 0 2
  • 當(dāng)一個(gè)系統(tǒng)訪問量上來的時(shí)候,不只是數(shù)據(jù)庫性能瓶頸問題了,數(shù)據(jù)庫數(shù)據(jù)安全也會浮現(xiàn),這時(shí)候合理使用數(shù)據(jù)庫鎖機(jī)制就顯得異...
    初來的雨天閱讀 3,611評論 0 22