AUTO_INCREMENT列在InnoDB里如何工作 |
發(fā)布時(shí)間: 2012/8/26 16:00:04 |
如果你為一個(gè)表指定AUTO_INCREMENT列,在數(shù)據(jù)詞典里的InnoDB表句柄包含一個(gè)名為自動(dòng)增長(zhǎng)計(jì)數(shù)器的計(jì)數(shù)器,它被用在為該列賦新值。自動(dòng)增長(zhǎng)計(jì)數(shù)器僅被存儲(chǔ)在主內(nèi)存中,而不是存在磁盤(pán)上。 InnoDB使用下列算法來(lái)為包含一個(gè)名為ai_col的AUTO_INCREMENT列的表T初始化自動(dòng)增長(zhǎng)計(jì)數(shù)器:服務(wù)器啟動(dòng)之后,當(dāng)一個(gè)用戶對(duì)表T做插入之時(shí),InnoDB執(zhí)行等價(jià)如下語(yǔ)句的動(dòng)作:
SELECT MAX(ai_col) FROM T FOR UPDATE;
語(yǔ)句取回的值逐次加一,并被賦給列和自動(dòng)增長(zhǎng)計(jì)數(shù)器。如果表是空的,值1被賦予該列。如果自動(dòng)增長(zhǎng)計(jì)數(shù)器沒(méi)有被初始化,而且用戶調(diào)用為表T顯示輸出的SHOW TABLE STATUS語(yǔ)句,則計(jì)數(shù)器被初始化(但不是增加計(jì)數(shù))并被存儲(chǔ)以供隨后的插入使用。注意,在這個(gè)初始化中,我們對(duì)表做一個(gè)正常的獨(dú)占讀鎖定,這個(gè)鎖持續(xù)到事務(wù)的結(jié)束。
InnoDB對(duì)為新創(chuàng)建表的初始化自動(dòng)增長(zhǎng)計(jì)數(shù)器允許同樣的過(guò)程。
注意,如果用戶在INSERT中為AUTO_INCREMENT列指定NULL或者0,InnoDB處理行,就仿佛值還沒(méi)有被指定,且為它生成一個(gè)新值。
自動(dòng)增長(zhǎng)計(jì)數(shù)器被初始化之后,如果用戶插入一個(gè)明確指定該列值的行,而且該值大于當(dāng)前計(jì)數(shù)器值,則計(jì)數(shù)器被設(shè)置為指定列值。如果沒(méi)有明確指定一個(gè)值,InnoDB給計(jì)數(shù)器增加一,并且賦新值給該列。 當(dāng)訪問(wèn)自動(dòng)增長(zhǎng)計(jì)數(shù)器之時(shí),InnoDB使用專(zhuān)用的表級(jí)的AUTO-INC鎖定,該鎖持續(xù)到當(dāng)前SQL語(yǔ)句的結(jié)束而不是到業(yè)務(wù)的結(jié)束。引入了專(zhuān)用鎖釋放策略,來(lái)為對(duì)一個(gè)含AUTO_INCREMENT列的表的插入改善部署。兩個(gè)事務(wù)不能同時(shí)對(duì)同一表有AUTO-INC鎖定。
注意,如果你回滾從計(jì)數(shù)器獲得數(shù)的事務(wù),你可能會(huì)在賦給AUTO_INCREMENT列的值的序列中發(fā)現(xiàn)間隙。 如果用戶給列賦一個(gè)賦值,或者,如果值大過(guò)可被以指定整數(shù)格式存儲(chǔ)的最大整數(shù),自動(dòng)增長(zhǎng)機(jī)制的行為不被定義。
在CREATE TABLE和ALTER TABLE語(yǔ)句中,InnoDB支持AUTO_INCREMENT = n 表選項(xiàng)來(lái)設(shè)置計(jì)數(shù)器初始值或變更當(dāng)前計(jì)數(shù)器值。因在本節(jié)早先討論的原因,這個(gè)選項(xiàng)的影響在服務(wù)器重啟后就無(wú)效了。 本文出自:億恩科技【1tcdy.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |