背景跟同學聊到
row_id
乙個邊界問題,這裡詳細說明下。
innodb
表若沒有定義主鍵,會使用系統的乙個預設遞增
row_id (dict_sys->row_id)
作為主鍵。每次插入一行加
1,到達最大值迴圈復用。
需要注意的是,雖然
dict_sys->row_id
被定義為乙個
unsigned long long,
但由於這個主鍵值只有
6個位元組,因此最大值是
2^48
。row_id
超過這個值還是會遞增,只是寫入的時候只取低位,可以認為是做取模操作。
問題
這就涉及到乙個問題,乙個長期執行的
mysql
裡,如果頻繁插入刪除行(像日誌類的表),即使最終表規模不是很大,仍可能會出現值
row_id
重用。而我們知道作為主鍵值,是不能重複的。
假設出現這種情況,在乙個表裡,新插入的一行的
row_id
與某乙個年代久遠的行的
row_id
出現衝突,會腫麼樣?
驗證
其實本來這裡只需要乙個結論。本文的目的還是跟大家**一種驗證的方法。有了上面的資訊,我們可以考慮設計如下的復現步驟:
1)建立一張無主鍵空表
2) gdb
設定dict_sys->row_id為1
3)
往空表插入若干行
4) gdb
設定dict_sys->row_id
為2^48
5)
再插入若干行
6)
看結果
結論
可以看到,行
(1),(2)
被覆蓋了。
比較合理點的方案應該是像
mysql
的表內自增主鍵一樣,報個
duplicate-key error.
InnoDB row id邊界溢位驗證
背景 跟同學聊到row id乙個邊界問題,這裡詳細說明下。innodb表若沒有定義主鍵,會使用系統的乙個預設遞增row id dict sys row id 作為主鍵。每次插入一行加1,到達最大值迴圈復用。需要注意的是,雖然dict sys row id 被定義為乙個unsigned long lo...
HTML CSS之邊界合併和邊界溢位
1.邊界合併只出現在塊級元素中,並且只會在上下邊距出現 2.塊級元素垂直上下邊距相遇,取較大的值 3.如果出現負邊距,這麼兩個元素的邊距就是上下邊距帶符號的和,如果負邊距的絕對值大於正邊距,就會出現重疊,後面的元素疊在前面的元素上 有上面的3點,下面我們就來一點一點的證明 1,2可以一起證明 正常情...
棧溢位,記憶體溢位
對於一台伺服器而言,每乙個使用者請求,都會產生乙個執行緒來處理這個請求,每乙個執行緒對應著乙個棧,棧會分配記憶體,此時如果請求過多,這時候記憶體不夠了,就會發生棧記憶體溢位。棧溢位是指不斷的呼叫方法,不斷的壓棧,最終超出了棧允許的棧深度,就會發生棧溢位,比如遞迴操作沒有終止,死迴圈。可以把記憶體比作...