MySQL的事務支持不是綁定在MySQL服務器本身,而是與存儲引擎相關1。MyISAM:不支持事務,用于只讀程序提高性能 2。InnoDB:支持ACID事務、行級鎖、并發 3。Berkeley DB:支持事務
一個事務是一個連續的一組數據庫操作,就好像它是一個單一的工作單元進行。
換言之,永遠不會是完整的事務,除非該組內的每個單獨的操作是成功的。如果在事務的任何操作失敗,則整個事務將失敗。
實際上,會俱樂部許多SQL查詢到一個組中,將執行所有的人都一起作為事務的一部分。
事務的特性:
事務有以下四個標準屬性的縮寫ACID,通常被稱為:
原子性: 確保工作單元內的所有操作都成功完成,否則事務將被中止在故障點,和以前的操作將回滾到以前的狀態。
一致性: 確保數據庫正確地改變狀態后,成功提交的事務。
隔離性: 使事務操作彼此獨立的和透明的。
持久性: 確保提交的事務的結果或效果的系統出現故障的情況下仍然存在。
在MySQL中,事務開始使用COMMIT或ROLLBACK語句開始工作和結束。
開始和結束語句的SQL命令之間形成了大量的事務。
COMMIT & ROLLBACK:
這兩個關鍵字提交和回滾主要用于MySQL的事務。
當一個成功的事務完成后,發出COMMIT命令應使所有參與表的更改才會生效。
如果發生故障時,應發出一個ROLLBACK命令返回的事務中引用的每一個表到以前的狀態。
可以控制的事務行為稱為AUTOCOMMIT設置會話變量。如果AUTOCOMMIT設置為1(默認值),然后每一個SQL語句(在事務與否)被認為是一個完整的事務,并承諾在默認情況下,當它完成。
AUTOCOMMIT設置為0時,發出SET AUTOCOMMIT =0命令,在隨后的一系列語句的作用就像一個事務,直到一個明確的COMMIT語句時,沒有活動的提交。
可以通過使用mysql_query()函數在PHP中執行這些SQL命令。
通用事務例子
這一系列事件是獨立于所使用的編程語言,可以建立在任何使用的語言來創建應用程序的邏輯路徑。
可以通過使用mysql_query()函數在PHP中執行這些SQL命令。
BEGIN WORK開始事務發出SQL命令
發出一個或多個SQL命令,如SELECT,INSERT,UPDATE或DELETE
檢查是否有任何錯誤,一切都依據的需要。
如果有任何錯誤,那么問題ROLLBACK命令,否則發出COMMIT命令。
在MySQL中的事務安全表類型:
如果打算使用MySQL事務編程,那么就需要一種特殊的方式創建表。有很多支持事務但最流行的是InnoDB表類型。
從源代碼編譯MySQL時,InnoDB表支持需要特定的編譯參數。
如果MySQL版本沒有InnoDB支持,請互聯網服務提供商建立一個版本的MySQL支持InnoDB表類型,或者下載并安裝Windows或Linux/UNIX的MySQL-Max二進制分發和使用的表類型在開發環境中。
如果MySQL安裝支持InnoDB表,只需添加一個的TYPE=InnoDB 定義表創建語句。
例如,下面的代碼創建InnoDB表tcount_tbl:
代碼如下 ? ?復制代碼 ? ?
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table tcount_tbl
? ?-> (
? ?-> tutorial_author varchar(40) NOT NULL,
? ?-> tutorial_count ?INT
? ?-> ) TYPE=InnoDB;
Query OK, 0 rows affected (0。
05 sec) ? ?
可以使用其他GEMINI或BDB表類型,但它取決于您的安裝,如果它支持這兩種類型。
由于項目設計里面,牽扯到了金錢的轉移,于是就要用到MYSQL的事務處理,來保證一組處理結果的正確性。
用了事務,就不可避免的要犧牲一部分速度,來保證數據的正確性。
只有InnoDB支持事務
事務 ACID Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)
1、事務的原子性
一組事務,要么成功;要么撤回。
2、穩定性
有非法數據(外鍵約束之類),事務撤回。
3、隔離性
事務獨立運行。
一個事務處理后的結果,影響了其他事務,那么其他事務會撤回。
事務的100%隔離,需要犧牲速度。
4、可靠性
軟、硬件崩潰后,InnoDB數據表驅動會利用日志文件重構修改。
可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項 決定什么時候吧事務保存到日志里。
開啟事務
START TRANSACTION 或 BEGIN
提交事務(關閉事務)
COMMIT
放棄事務(關閉事務)
ROLLBACK
折返點
SAVEPOINT adqoo_1
ROLLBACK TO SAVEPOINT adqoo_1
發生在折返點 adqoo_1 之前的事務被提交,之后的被忽略
事務的終止
設置“自動提交”模式
SET AUTOCOMMIT = 0
每條SQL都是同一個事務的不同命令,之間由 COMMIT 或 ROLLBACK隔開
掉線后,沒有 COMMIT 的事務都被放棄
事務鎖定模式
系統默認: 不需要等待某事務結束,可直接查詢到結果,但不能再進行修改、刪除。
缺點:查詢到的結果,可能是已經過期的。
優點:不需要等待某事務結束,可直接查詢到結果。
需要用以下模式來設定鎖定模式
1、SELECT …… LOCK IN SHARE MODE(共享鎖)
查詢到的數據,就是數據庫在這一時刻的數據(其他已commit事務的結果,已經反應到這里了)
SELECT 必須等待,某個事務結束后才能執行
2、SELECT …… FOR UPDATE(排它鎖)
例如 SELECT * FROM tablename WHERE id200
那么id>200的記錄無法被插入
5、死鎖
自動識別死鎖
先進來的進程被執行,后來的進程收到出錯消息,并按ROLLBACK方式回滾
innodb_lock_wait_timeout = n 來設置最長等待時間,默認是50秒
事務隔離模式
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL
READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE
1、不帶SESSION、GLOBAL的SET命令
只對下一個事務有效
2、SET SESSION
為當前會話設置隔離模式
3、SET GLOBAL
為以后新建的所有MYSQL連接設置隔離模式(當前連接不包括在內)
隔離模式
? READ UNCOMMITTED
不隔離SELECT
其他事務未完成的修改(未COMMIT),其結果也考慮在內
? READ COMMITTED
把其他事務的 COMMIT 修改考慮在內
同一個事務中,同一 SELECT 可能返回不同結果
? REPEATABLE READ(默認)
不把其他事務的修改考慮在內,無論其他事務是否用COMMIT命令提交過
同一個事務中,同一 SELECT 返回同一結果(前提是本事務,不修改)
? SERIALIZABLE
和REPEATABLE READ類似,給所有的SELECT都加上了 共享鎖
出錯處理
根據出錯信息,執行相應的處理。
全部