自增序列產生器的實現思路

自增序列產生器的實現思路

 

l   需求

u  實現MySQL自帶的字段值自動增長等效的功能;

u  同一應用集群中數據庫表的自增類型字段值具有全局唯一性;

u  支持數據庫級別的水平拆分表,同時還需要支持數據庫內部的水平拆分表,其ID值都來源於同一條配置記錄;  www.aiwalls.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.aiwalls.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.aiwalls.com  

1>. 掛起當前的序列調用請求;

2>. 做序列區間值獲取的事務;

3>. 把新獲得區間值的START_VALUE,給予掛起的調用請求;

總結:每個區間值的最大值(END_VALUE)始終作為當前期間的棄用值。

 

 

 

作者 snoopy7713

發佈留言