程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 自增序列產生器的實現思路

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

編輯:MySQL綜合教程


自增序列產生器的實現思路   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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved