国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

Mysql全局ID生成方法

2024-07-24 12:45:14
字體:
來源:轉載
供稿:網友

生產系統隨著業務增長總會經歷一個業務量由小變大的過程,可擴展性是考量數據庫系統高可用性的一個重要指標;在單表/數據庫數據量過大,更新量不斷飆漲時,MySQL DBA往往會對業務系統提出sharding的方案。既然要sharding,那么不可避免的要討論到sharding key問題,在有些業務系統中,必須保證sharding key全局唯一,比如存放商品的數據庫等,那么如何生成全局唯一的ID呢,下文將從DBA的角度介紹幾種常見的方案。

1、使用CAS思想

什么是CAS協議

Memcached于1.2.4版本新增CAS(Check and Set)協議類同于Java并發的CAS(Compare and Swap)原子操作,處理同一item被多個線程更改過程的并發問題

CAS的基本原理

基本原理非常簡單,一言以蔽之,就是“版本號”,每個存儲的數據對象,都有一個版本號。

我們可以從下面的例子來理解:

不采用CAS,則有如下的情景:

 •第一步,A取出數據對象X;
 •第二步,B取出數據對象X;
 •第三步,B修改數據對象X,并將其放入緩存;
 •第四步,A修改數據對象X,并將其放入緩存。

結論:第四步中會產生數據寫入沖突。

采用CAS協議,則是如下的情景。

 •第一步,A取出數據對象X,并獲取到CAS-ID1;

•第二步,B取出數據對象X,并獲取到CAS-ID2; 

•第三步,B修改數據對象X,在寫入緩存前,檢查CAS-ID與緩存空間中該數據的CAS-ID是否一致。結果是“一致”,就將修改后的帶有CAS-ID2的X寫入到緩存。

 •第四步,A修改數據對象Y,在寫入緩存前,檢查CAS-ID與緩存空間中該數據的CAS-ID是否一致。結果是“不一致”,則拒絕寫入,返回存儲失敗。

這樣CAS協議就用了“版本號”的思想,解決了沖突問題。(樂觀鎖概念)

其實這里并不是嚴格的CAS,而是使用了比較交換原子操作的思想。

生成思路如下:每次生成全局id時,先從sequence表中獲取當前的全局最大id。然后在獲取的全局id上做加1操作,加1后的值更新到數據庫,如加1后的值為203,表名是users,數據表結構如下:

CREATE TABLE `SEQUENCE` ( `name` varchar(30) NOT NULL COMMENT '分表的表名', `gid` bigint(20) NOT NULL COMMENT '最大全局id', PRIMARY KEY (`name`)) ENGINE=innodb

sql語句

update sequence set gid = 203 where name = 'users' and gid < 203;

sql語句的 and gid < 203 是為了保證并發環境下gid的值只增不減。

如果update語句的影響記錄條數為0說明,已經有其他進程提前生成了203這個值,并寫入了數據庫。需要重復以上步驟從新生成。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 徐州市| 大洼县| 崇左市| 肇庆市| 龙陵县| 大化| 苍南县| 遂溪县| 沙坪坝区| 昌都县| 托克逊县| 平湖市| 元江| 博客| 甘谷县| 安阳市| 阳曲县| 房产| 定安县| 平塘县| 峨山| 依兰县| 宜阳县| 江津市| 临湘市| 渝中区| 囊谦县| 沾益县| 沅江市| 怀安县| 永年县| 梅州市| 龙井市| 景谷| 石狮市| 明溪县| 绥宁县| 印江| 托克托县| 太仆寺旗| 古交市|