Mic*_*kin 10 mysql transactions
我们将MySQL与InnoDB存储引擎和事务一起使用很多,我们遇到了一个问题:我们需要一种很好的方法来模拟MySQL中的Oracle SEQUENCE.要求是: - 并发支持 - 事务安全 - 最大性能(意味着最小化锁和死锁)
我们不关心是否会使用某些值,即顺序中的间隙是可以的.有一种简单的方法可以通过创建一个带计数器的独立InnoDB表来实现这一点,但这意味着它将参与事务并引入锁和等待.我想尝试使用手动锁,任何其他想法或最佳实践的MyISAM表?
Arn*_*sen 15
如果自动增量不能满足您的需求,您可以创建一个原子序列机制,其中包含n个命名序列,如下所示:
创建一个表来存储序列:
CREATE TABLE sequence (
seq_name varchar(20) unique not null,
seq_current unsigned int not null
);
Run Code Online (Sandbox Code Playgroud)
假设你在表中有'foo'行,你可以原子地获得下一个序列id,如下所示:
UPDATE sequence SET seq_current = (@next := seq_current + 1) WHERE seq_name = 'foo';
SELECT @next;
Run Code Online (Sandbox Code Playgroud)
不需要锁.两个语句都需要在同一个会话中执行,以便在选择发生时实际定义局部变量@next.
MySQL手册中给出了正确的方法:
UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field + 1);
SELECT LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)
我们是一家高交易游戏公司,需要这些解决方案来满足我们的需求.Oracle序列的一个特性也是可以设置的增量值.
解决方案使用DUPLICATE KEY.
CREATE TABLE sequences (
id BIGINT DEFAULT 1,
name CHAR(20),
increment TINYINT,
UNIQUE KEY(name)
);
Run Code Online (Sandbox Code Playgroud)
要获得下一个索引:
摘要以下是存储过程或函数sp_seq_next_val(VARCHAR):
INSERT INTO sequences (name) VALUES ("user_id") ON DUPLICATE KEY UPDATE id = id + increment;<br/>
SELECT id FROM sequences WHERE name = "user_id";
Run Code Online (Sandbox Code Playgroud)