2014年4月26日 星期六

MySQL Transaction

MySQL 常用的兩個資料表類型:MyISAM、InnoDB,MyISAM 不支援交易功能

交易功能4個特性 (ACID)

  •  Atomicity (原子性、不可分割):交易內的 SQL 指令,不管在任何情況,都只能是全部執行完成,或全部不執行。若是發生無法全部執行完成的狀況,則會回滾(rollback)到完全沒執行時的狀態。
  • Consistency (一致性):交易完成後,必須維持資料的完整性。所有資料必須符合預設的驗證規則、外鍵限制...等。
  • Isolation (隔離性):多個交易可以獨立、同時執行,不會互相干擾。這一點跟後面會提到的「隔離層級」有關。
  • Durability (持久性):交易完成後,異動結果須完整的保留。

開始進入交易模式

  • SQL 指令:START TRANSACTION 或 BEGIN

結束交易模式

  • 交易完成:使用 COMMIT 儲存所有變動,並結束交易。
  • 交易過程異常:使用 ROLLBACK 回滾,取消交易,還原到未進行交易的狀態。(若交易過程連線中斷,沒 COMMIT 提交的變更,亦會如同執行 ROLLBACK 取消交易)

儲存點 (SAVEPOINT)

  • 交易過程中,可標示多個不同的儲存點,有需要時可 ROLLBACK 到某個儲存點。
  • 建立儲存點:SAVEPOINT 名稱
  • 刪除儲存點:RELEASE SAVEPOINT 名稱
  • ROLLBACK 到某個儲存點:ROLLBACK TO SAVEPOINT 名稱
  • 如果建立新儲存點時,已有同名稱的舊儲存點,舊儲存點將被刪除,並建立新的儲存點。
  • 官網說明:http://dev.mysql.com/doc/refman/5.7/en/savepoint.html

不能 ROLLBACK 的指令

會造成自動終止交易並 COMMIT 的指令

  • 執行這些指令時,如同先執行了 commit,也就是會先有 commit 的效果。
  • DDL 指令:ALERT TABLE、CREATE INDEX、CREATE TABLE、DROP TABLE、DROP DATABASE、RENAME TABLE、TRUNCATE、LOCK TABLES、UNLOCK TABLES...等
  • SET AUTOCOMMIT=1、 BEGIN、START TRANSACTION
  • 其他,可參考官網更詳細的說明:http://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

 AUTOCOMMIT 自動提交設定

  • AUTOCOMMIT 的設定值,預設一般都是 1
  • 查詢目前 AUTOCOMMIT 的設定值:SELECT @@AUTOCOMMIT
  • 將 AUTOCOMMIT 改為 0 時 ( SET AUTOCOMMIT=0 ),就算沒使用 START TRANSACTION 或 BEGIN ,整個連線執行的 SQL 指令,都會等到下達 COMMIT 提交後,才會真正儲存變更。也就是當 AUTOCOMMIT=0 時,跟在交易模式下相同。

沒有留言: