自增序列產生器的實現思路
l 需求
u 實現MySQL自帶的字段值自動增長等效的功能;
u 同一應用集群中數據庫表的自增類型字段值具有全局唯一性;
u 支持數據庫級別的水平拆分表,同時還需要支持數據庫內部的水平拆分表,其ID值都來源於同一條配置記錄; www.2cto.com
l 存儲設計
序列產生器配置表increment_config結構:
列名稱 數據類型 是否為空 默認值 是否自增 主鍵/索引 備注
ID INT UNSIGNED N AUTO_INCREMENT PRIMARY KEY(ID) 唯一標示,無意義
TABLE_NAME VARCHAR(40) N UNIQUE INDEX 表名稱
TABLE_TOTAL TINYINT UNSIGNED N 0 標記數據庫內分表的數量
COLUMN_NAME VARCHAR(40) N 字段名稱
START_VALUE BIGINT UNSIGNED N 1 開始值
OFFSET_VALUE SMALLINT UNSIGNED N 10000 增長的步長
FLAG TINYINT N 0 0–正常;1–作廢值
GMT_MODIFIED TIMESTAMP N 數據庫自動更新此值
備注:
1>. GMT_MODIFIED不由程序或人為主動去負責更新與填寫,而是通過數據庫的特性自動填寫與更新;
2>. 對於數據庫內部的水平分表,即TABLE_TOTAL<>0,則通過TABLE_NAME+TABLE_TOTAL組合區分;
l 對存儲表的操作 www.2cto.com
u 初始化的 SQL
對於需要用到序列產生器的表,則在此配置表中增加一條記錄,例如:
INSERT INTO(TABLE_NAME,TABLE_TOTAL,COLUMN_NAME,START_VALUE,OFFSET_VALUE,FLAG)
VALUES(‘msg_’,23, ’MSG_ID’,1,10000,0);
u 序列生成器操作的 SQL
程序每次獲得序列區間段,以及更新相關數據值操作的事務的過程SQL,假設msg_系列表對應的記錄,在配置表中ID=1。
START TRNSACTION;
SELECT ID, TABLE_NAME,COLUMN_NAME,START_VALUE,START_VALUE+OFFSET_VALUE AS END_VALUE
FROM increment_config WHERE ID=1 FOR UPDATE;
UPDATE increment_config SET START_VALUE=START_VALUE+OFFSET_VALUE WHERE ID=1;
COMMIT;
l 程序實現建議
u 為提供序列產生的速度,而提高業務處理的性能。程序需要以拿序列區間的方式實現,而不是每次需要的時候,都要去數據庫獲得序列號值;
u 程序在每次啟動的時候,要初始化配置表中所有有效記錄的序列區間值;
u 當程序拿到的區間值START_VALUE,經過一段時間使用後達到:START_VALUE=END_VALUE,處理步驟如下: www.2cto.com
1>. 掛起當前的序列調用請求;
2>. 做序列區間值獲取的事務;
3>. 把新獲得區間值的START_VALUE,給予掛起的調用請求;
總結:每個區間值的最大值(END_VALUE)始終作為當前期間的棄用值。
作者 snoopy7713