來源:轉(zhuǎn)載
MySQL的事務(wù)支持不是綁定在MySQL服務(wù)器本身,而是與存儲(chǔ)引擎相關(guān)1.MyISAM:不支持事務(wù)挨约,用于只讀程序提高性能 2.InnoDB:支持ACID事務(wù)、行級(jí)鎖、并發(fā) 3.Berkeley DB:支持事務(wù)
一個(gè)事務(wù)是一個(gè)連續(xù)的一組數(shù)據(jù)庫操作炭懊,就好像它是一個(gè)單一的工作單元進(jìn)行尉姨。換言之庵朝,永遠(yuǎn)不會(huì)是完整的事務(wù),除非該組內(nèi)的每個(gè)單獨(dú)的操作是成功的又厉。如果在事務(wù)的任何操作失敗九府,則整個(gè)事務(wù)將失敗。
實(shí)際上覆致,會(huì)俱樂部許多SQL查詢到一個(gè)組中侄旬,將執(zhí)行所有的人都一起作為事務(wù)的一部分。
事務(wù)的特性:
事務(wù)有以下四個(gè)標(biāo)準(zhǔn)屬性的縮寫ACID煌妈,通常被稱為:
原子性: 確保工作單元內(nèi)的所有操作都成功完成儡羔,否則事務(wù)將被中止在故障點(diǎn)宣羊,和以前的操作將回滾到以前的狀態(tài)。
一致性: 確保數(shù)據(jù)庫正確地改變狀態(tài)后汰蜘,成功提交的事務(wù)仇冯。
隔離性: 使事務(wù)操作彼此獨(dú)立的和透明的。
持久性: 確保提交的事務(wù)的結(jié)果或效果的系統(tǒng)出現(xiàn)故障的情況下仍然存在鉴扫。
在MySQL中赞枕,事務(wù)開始使用COMMIT或ROLLBACK語句開始工作和結(jié)束。開始和結(jié)束語句的SQL命令之間形成了大量的事務(wù)坪创。
COMMIT & ROLLBACK:
這兩個(gè)關(guān)鍵字提交和回滾主要用于MySQL的事務(wù)炕婶。
當(dāng)一個(gè)成功的事務(wù)完成后,發(fā)出COMMIT命令應(yīng)使所有參與表的更改才會(huì)生效莱预。
如果發(fā)生故障時(shí)柠掂,應(yīng)發(fā)出一個(gè)ROLLBACK命令返回的事務(wù)中引用的每一個(gè)表到以前的狀態(tài)。
可以控制的事務(wù)行為稱為AUTOCOMMIT設(shè)置會(huì)話變量依沮。如果AUTOCOMMIT設(shè)置為1(默認(rèn)值)涯贞,然后每一個(gè)SQL語句(在事務(wù)與否)被認(rèn)為是一個(gè)完整的事務(wù),并承諾在默認(rèn)情況下危喉,當(dāng)它完成宋渔。 AUTOCOMMIT設(shè)置為0時(shí),發(fā)出SET AUTOCOMMIT =0命令辜限,在隨后的一系列語句的作用就像一個(gè)事務(wù)皇拣,直到一個(gè)明確的COMMIT語句時(shí),沒有活動(dòng)的提交薄嫡。
可以通過使用mysql_query()函數(shù)在PHP中執(zhí)行這些SQL命令氧急。
事務(wù) ACID Atomicity(原子性)、Consistency(穩(wěn)定性)毫深、Isolation(隔離性)吩坝、Durability(可靠性)
1、事務(wù)的原子性
一組事務(wù)哑蔫,要么成功钉寝;要么撤回。
2闸迷、穩(wěn)定性
有非法數(shù)據(jù)(外鍵約束之類)嵌纲,事務(wù)撤回。
3稿黍、隔離性
事務(wù)獨(dú)立運(yùn)行。
一個(gè)事務(wù)處理后的結(jié)果崩哩,影響了其他事務(wù)巡球,那么其他事務(wù)會(huì)撤回言沐。
事務(wù)的100%隔離,需要犧牲速度酣栈。
4险胰、可靠性
軟、硬件崩潰后矿筝,InnoDB數(shù)據(jù)表驅(qū)動(dòng)會(huì)利用日志文件重構(gòu)修改起便。
可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項(xiàng) 決定什么時(shí)候吧事務(wù)保存到日志里窖维。
開啟事務(wù)
START TRANSACTION 或 BEGIN
提交事務(wù)(關(guān)閉事務(wù))
COMMIT
放棄事務(wù)(關(guān)閉事務(wù))
ROLLBACK
折返點(diǎn)
SAVEPOINT adqoo_1
ROLLBACK TO SAVEPOINT adqoo_1
發(fā)生在折返點(diǎn) adqoo_1 之前的事務(wù)被提交榆综,之后的被忽略
事務(wù)的終止
設(shè)置“自動(dòng)提交”模式
SET AUTOCOMMIT = 0
每條SQL都是同一個(gè)事務(wù)的不同命令,之間由 COMMIT 或 ROLLBACK隔開
掉線后铸史,沒有 COMMIT 的事務(wù)都被放棄
事務(wù)鎖定模式
系統(tǒng)默認(rèn): 不需要等待某事務(wù)結(jié)束鼻疮,可直接查詢到結(jié)果,但不能再進(jìn)行修改琳轿、刪除判沟。
缺點(diǎn):查詢到的結(jié)果,可能是已經(jīng)過期的崭篡。
優(yōu)點(diǎn):不需要等待某事務(wù)結(jié)束挪哄,可直接查詢到結(jié)果。
需要用以下模式來設(shè)定鎖定模式
1琉闪、SELECT …… LOCK IN SHARE MODE(共享鎖)
查詢到的數(shù)據(jù)迹炼,就是數(shù)據(jù)庫在這一時(shí)刻的數(shù)據(jù)(其他已commit事務(wù)的結(jié)果,已經(jīng)反應(yīng)到這里了)
SELECT 必須等待塘偎,某個(gè)事務(wù)結(jié)束后才能執(zhí)行
2疗涉、SELECT …… FOR UPDATE(排它鎖)
例如 SELECT * FROM tablename WHERE id<200
那么id<200的數(shù)據(jù),被查詢到的數(shù)據(jù)吟秩,都將不能再進(jìn)行修改咱扣、刪除、SELECT …… LOCK IN SHARE MODE操作
一直到此事務(wù)結(jié)束
共享鎖 和 排它鎖 的區(qū)別:在于是否阻斷其他客戶發(fā)出的 SELECT …… LOCK IN SHARE MODE命令
3涵防、INSERT / UPDATE / DELETE
所有關(guān)聯(lián)數(shù)據(jù)都會(huì)被鎖定闹伪,加上排它鎖
4、防插入鎖
例如 SELECT * FROM tablename WHERE id>200
那么id>200的記錄無法被插入
5壮池、死鎖
自動(dòng)識(shí)別死鎖
先進(jìn)來的進(jìn)程被執(zhí)行偏瓤,后來的進(jìn)程收到出錯(cuò)消息,并按ROLLBACK方式回滾
innodb_lock_wait_timeout = n 來設(shè)置最長等待時(shí)間椰憋,默認(rèn)是50秒
事務(wù)隔離模式
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL
READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE
1厅克、不帶SESSION、GLOBAL的SET命令
只對(duì)下一個(gè)事務(wù)有效
2橙依、SET SESSION
為當(dāng)前會(huì)話設(shè)置隔離模式
3证舟、SET GLOBAL
為以后新建的所有MYSQL連接設(shè)置隔離模式(當(dāng)前連接不包括在內(nèi))
隔離模式
READ UNCOMMITTED
不隔離SELECT
其他事務(wù)未完成的修改(未COMMIT)硕旗,其結(jié)果也考慮在內(nèi)
READ COMMITTED
把其他事務(wù)的 COMMIT 修改考慮在內(nèi)
同一個(gè)事務(wù)中,同一 SELECT 可能返回不同結(jié)果
REPEATABLE READ(默認(rèn))
不把其他事務(wù)的修改考慮在內(nèi)女责,無論其他事務(wù)是否用COMMIT命令提交過
同一個(gè)事務(wù)中漆枚,同一 SELECT 返回同一結(jié)果(前提是本事務(wù),不修改)
SERIALIZABLE
和REPEATABLE READ類似抵知,給所有的SELECT都加上了 共享鎖
出錯(cuò)處理
根據(jù)出錯(cuò)信息墙基,執(zhí)行相應(yīng)的處理