在MySQL中可以使用InnoDB的引擎開啟事物,保證數(shù)據(jù)的操作完整。
提到事物,肯定有ACID,即原子性、一致性、隔離性、持久性。
關(guān)于數(shù)據(jù)隔離級(jí)別包括:讀未提交、讀已提交、可重復(fù)讀、串行化。
讀未提交(read uncommitted)是指一個(gè)事物還沒(méi)有提交時(shí),它做的變更后的數(shù)據(jù)可以被其他事務(wù)查詢到。
讀已提交(read committed)是指一個(gè)事務(wù)提交之后,它做的變更后數(shù)據(jù)才會(huì)被其他事務(wù)查詢到。
可重復(fù)讀(repeatable read)是指一個(gè)事務(wù)執(zhí)行過(guò)程中可以查詢到的數(shù)據(jù),和事務(wù)一開始啟動(dòng)時(shí)查詢的數(shù)據(jù)保持一致。
串行化(serializable)是指在一個(gè)事務(wù)操作數(shù)據(jù)時(shí),無(wú)論時(shí)讀還是寫都會(huì)加鎖,其他事務(wù)不可操作當(dāng)前數(shù)據(jù),必須等待當(dāng)前事務(wù)完成,才可以執(zhí)行。
事務(wù)隔離級(jí)別的實(shí)現(xiàn)
在MySQL中,所有的數(shù)據(jù)記錄在更新的時(shí)候都會(huì)同時(shí)記錄一條回滾操作,記錄上的最新值,通過(guò)回滾操作,都可以得到前一個(gè)狀態(tài)的值?;貪L日志在系統(tǒng)判斷當(dāng)沒(méi)有事務(wù)需要用到當(dāng)前回滾日志時(shí),將會(huì)刪除當(dāng)前回滾日志。所以說(shuō)盡量不要使用長(zhǎng)事務(wù)。長(zhǎng)事務(wù)意味這系統(tǒng)中存在很老的事務(wù)視圖,由于這些事務(wù)隨時(shí)都有可能被用到,所以大量的回滾日志并不會(huì)被刪除,會(huì)導(dǎo)致占用大量存儲(chǔ)空間。
事務(wù)的啟動(dòng)
[if !supportLists]1.[endif]顯示啟動(dòng)事務(wù)
Begin或 start transaction;提交事務(wù)commit 回滾事務(wù)rollback
[if !supportLists]2.[endif]Set autocommit = 0,這個(gè)命令會(huì)將這個(gè)線程的自動(dòng)提交關(guān)閉,如果當(dāng)前線程運(yùn)行select語(yǔ)句后,就會(huì)啟動(dòng)事務(wù),并且不會(huì)自動(dòng)提交,事務(wù)一直存在直到斷開連接。