MySQL分布式全局自增指的是多個(gè)MySQL分布式節(jié)點(diǎn)共享全局唯一自增ID的一種技術(shù)方案。
常規(guī)的自增ID方式為每個(gè)節(jié)點(diǎn)設(shè)置一個(gè)自增起點(diǎn),并在每次插入數(shù)據(jù)時(shí)進(jìn)行自增。但是,在分布式系統(tǒng)中,每個(gè)節(jié)點(diǎn)都有自己的自增起點(diǎn),如果多個(gè)節(jié)點(diǎn)都在同時(shí)插入數(shù)據(jù),就會(huì)出現(xiàn)ID沖突的情況。
為了解決這個(gè)問(wèn)題,可以使用MySQL分布式全局自增技術(shù)。實(shí)現(xiàn)方式大致如下:
CREATE TABLE `id_generate` ( `table_name` varchar(64) NOT NULL COMMENT '表名稱', `max_id` bigint(20) NOT NULL COMMENT '當(dāng)前表的最大ID', PRIMARY KEY (`table_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分布式ID生成表';
在MySQL中創(chuàng)建名為id_generate的表,用于存儲(chǔ)每個(gè)表的最大ID。同時(shí),在代碼中添加如下方法:
public Long generate(String tableName) { String sql = "UPDATE id_generate SET max_id=LAST_INSERT_ID(max_id+1) WHERE table_name='" + tableName + "'"; jdbcTemplate.execute(sql); return jdbcTemplate.queryForObject("SELECT LAST_INSERT_ID()", Long.class); }
該方法查詢id_generate表中指定表名的max_id值,并將其加一更新到數(shù)據(jù)庫(kù)中。更新完成后,使用MySQL的LAST_INSERT_ID()方法獲取剛剛更新的max_id值。
使用該方法,每個(gè)節(jié)點(diǎn)都可以通過(guò)id_generate表獲取全局唯一的ID。在分布式系統(tǒng)中,多個(gè)節(jié)點(diǎn)同時(shí)插入時(shí),也可以保證ID的唯一性。