mvcc多版本并發(fā)控制 mysql mvcc解決什么問題?
mysql mvcc解決什么問題?解釋如下:MySQL中的大多數(shù)事務(wù)存儲(chǔ)引擎不實(shí)現(xiàn)簡(jiǎn)單的行級(jí)鎖。為了提高并發(fā)性能,它們通常同時(shí)實(shí)現(xiàn)多版本并發(fā)控制(mvcc)。不僅mysql,Oracle、Postgr
mysql mvcc解決什么問題?
解釋如下:
MySQL中的大多數(shù)事務(wù)存儲(chǔ)引擎不實(shí)現(xiàn)簡(jiǎn)單的行級(jí)鎖。為了提高并發(fā)性能,它們通常同時(shí)實(shí)現(xiàn)多版本并發(fā)控制(mvcc)。不僅mysql,Oracle、PostgreSQL等數(shù)據(jù)庫(kù)系統(tǒng)都實(shí)現(xiàn)了mvcc,但它們的實(shí)現(xiàn)機(jī)制不盡相同,因?yàn)閙vcc沒有相同的標(biāo)準(zhǔn)。
Mvcc可以被視為行級(jí)鎖定的變體,但在許多情況下它避免了鎖定操作,因此成本較低。大多數(shù)mvcc實(shí)現(xiàn)非阻塞讀操作,而寫操作只鎖定必要的行。
Mvcc是通過保存特定時(shí)間點(diǎn)的數(shù)據(jù)快照來實(shí)現(xiàn)的。換句話說,無論執(zhí)行多長(zhǎng)時(shí)間,每個(gè)事務(wù)看到的數(shù)據(jù)都是一致的。根據(jù)事務(wù)的不同開始時(shí)間,每個(gè)事物在同一時(shí)間為同一個(gè)表看到的數(shù)據(jù)可能不同。
不同存儲(chǔ)引擎的mvcc實(shí)現(xiàn)不同,典型的是樂觀并發(fā)控制和悲觀并發(fā)控制。
InnoDB的mvcc是通過在每行記錄后面保存兩個(gè)隱藏列來實(shí)現(xiàn)的。兩列中的一列保存行的創(chuàng)建時(shí)間,另一列保存行的過期時(shí)間(刪除時(shí)間)。它存儲(chǔ)的不是實(shí)時(shí)值,而是系統(tǒng)版本號(hào)。每次啟動(dòng)新事務(wù)時(shí),系統(tǒng)版本號(hào)將自動(dòng)遞增。事務(wù)開始時(shí)的系統(tǒng)版本號(hào)將用作事務(wù)的版本號(hào),用于與找到的每行記錄的版本號(hào)進(jìn)行比較。