亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Mysql事務(wù)隔離

alighters / 2079人閱讀

摘要:數(shù)據(jù)庫(kù)事務(wù)隔離事務(wù)的介紹事務(wù)就是一組原子性的查詢,或者說是一個(gè)獨(dú)立的工作單元。事務(wù)可以讀取未提交的數(shù)據(jù),也被稱為臟讀。在的情況下,用顯式啟動(dòng)的事務(wù),如果執(zhí)行則提交事務(wù)。監(jiān)控表,發(fā)現(xiàn)長(zhǎng)事務(wù)報(bào)警。

數(shù)據(jù)庫(kù)事務(wù)隔離 事務(wù)的介紹

事務(wù)就是一組原子性的sql查詢,或者說是一個(gè)獨(dú)立的工作單元。簡(jiǎn)而言之,事務(wù)內(nèi)的語句要么全部執(zhí)行成功,要么全部執(zhí)行失敗。

在Mysql中,事務(wù)支持是在引擎層實(shí)現(xiàn)的,但并不是所有的Mysql引擎都支持事務(wù),比如MyISAM引擎就不支持事務(wù),這也是MyISAM被InnoDB取代的重要原因之一。

提到事務(wù),我們肯定會(huì)想到ACID:

原子性(Atomicity)

一致性(Consistency)

隔離性(Isolation)

持久性(Durability)

隔離級(jí)別

當(dāng)數(shù)據(jù)庫(kù)中有多個(gè)事務(wù)同時(shí)執(zhí)行時(shí),就可能會(huì)出現(xiàn)臟讀、不可重復(fù)讀、幻讀等問題,因?yàn)榫陀辛耸聞?wù)隔離級(jí)別的概念。

SQL標(biāo)準(zhǔn)正定義了四種隔離級(jí)別:

READ UNCOMMITTED (未提交讀)

事務(wù)中的修改,即使還沒有提交,對(duì)其他事務(wù)都是可見的。事務(wù)可以讀取未提交的數(shù)據(jù),也被稱為臟讀(Dirty Read)。

READ COMMITTED(提交讀)

一個(gè)事務(wù)提交后,所做的變更才能被其他事務(wù)看到。這個(gè)級(jí)別也叫不可重復(fù)讀,因?yàn)槭聞?wù)中執(zhí)行2次相同的查詢,可能得到的結(jié)果是不一樣的。

REPEATABLE READ(可重復(fù)讀)

一個(gè)事務(wù)執(zhí)行的過程中,總是和這個(gè)事務(wù)在啟動(dòng)時(shí)看到的數(shù)據(jù)是一致的。當(dāng)然在這個(gè)級(jí)別下,未提交的數(shù)據(jù)變更對(duì)其他事務(wù)也是不可見的。

SERIALIZABLE(可串行化)

對(duì)同一行記錄,寫和讀都會(huì)加鎖,當(dāng)出現(xiàn)讀寫鎖沖突時(shí),后訪問的事務(wù)必須等前一個(gè)事務(wù)執(zhí)行完成才能繼續(xù)執(zhí)行,就會(huì)導(dǎo)致大量的超時(shí)和鎖爭(zhēng)用的問題。

在實(shí)現(xiàn)上,數(shù)據(jù)庫(kù)里面會(huì)創(chuàng)建一個(gè)視圖,訪問的時(shí)候以視圖的邏輯為準(zhǔn)。

在可重復(fù)讀這個(gè)隔離級(jí)別下,這個(gè)視圖是事務(wù)開啟的時(shí)候創(chuàng)建的,整個(gè)事務(wù)期間都用這個(gè)視圖。

在讀提交的隔離級(jí)別下,這個(gè)視圖是在sql語句開始執(zhí)行的時(shí)候創(chuàng)建的。

在讀未提交的隔離級(jí)別下,直接返回記錄上的最新值,沒有視圖概念。

在串行化的隔離級(jí)別下,直接用加鎖的方式避免并行訪問。

配置的方式是將啟動(dòng)參數(shù)transaction-isolation設(shè)置成想要的隔離級(jí)別。

查看當(dāng)前設(shè)置:

mysql> show variables like "transaction_isolation";
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

總之,存在即合理,不同的隔離級(jí)別適用于不同的場(chǎng)景,具體我們應(yīng)該根據(jù)業(yè)務(wù)場(chǎng)景來決定。

事務(wù)隔離的實(shí)現(xiàn)

在Mysql中,實(shí)際上每條記錄的更新同時(shí)也會(huì)記錄一條回滾操作,記錄上的最新值通過回滾操作,都可以得到前一個(gè)狀態(tài)的值。

系統(tǒng)會(huì)自動(dòng)判斷,當(dāng)沒有事務(wù)再需要回滾日志時(shí),會(huì)刪除回滾日志。

為什么不建議使用長(zhǎng)事務(wù):

長(zhǎng)事務(wù)意味著系統(tǒng)里面會(huì)存在很老的事務(wù)視圖,由于這些事務(wù)隨時(shí)可以訪問數(shù)據(jù)庫(kù)里面的任何數(shù)據(jù),所以這個(gè)事務(wù)提交之前,數(shù)據(jù)庫(kù)里可能用到的回滾記錄必須保留著,這就會(huì)占用大量的存儲(chǔ)空間。同時(shí)長(zhǎng)事務(wù)還占用鎖資源,也可能拖垮整個(gè)庫(kù)。

事務(wù)啟動(dòng)的方式

顯式啟動(dòng)事務(wù)語句,begin或者start transaction,提交就是commit,回滾用rollback。

set autocommit = 0,這個(gè)命令會(huì)將線程的自動(dòng)提交關(guān)掉,意味著如果執(zhí)行一個(gè)select 語句,這個(gè)事務(wù)就啟動(dòng)了,并且不會(huì)自動(dòng)提交,直到你主動(dòng)執(zhí)行commit或者rollback,或者斷開連接。

個(gè)人建議還是通過第一種方式顯式啟動(dòng)事務(wù),避免長(zhǎng)事務(wù)的發(fā)生。

在 set autocommit = 1 的情況下,用 begin 顯式啟動(dòng)的事務(wù),如果執(zhí)行 commit 則提交事務(wù)。如果執(zhí)行 commit work and chain,則是提交事務(wù)并自動(dòng)啟動(dòng)下一個(gè)事務(wù),這樣也省去了再次執(zhí)行 begin 語句的開銷。

查詢長(zhǎng)事務(wù):

下面語句是查詢持續(xù)時(shí)間超過60s的事務(wù)

mysql> select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;
Empty set (0.00 sec)

總結(jié)下來,我們?cè)陂_發(fā)過程中,盡量少用長(zhǎng)事務(wù),如果無法避免,保證邏輯日志空間足夠大,并且支持動(dòng)態(tài)日志空間增長(zhǎng)。監(jiān)控Innodb_trx表,發(fā)現(xiàn)長(zhǎng)事務(wù)報(bào)警。

歡迎交流。

參考資料

《高性能Mysql》

極客時(shí)間-Mysql實(shí)戰(zhàn)45講

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/17899.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<