一尘不染

在MySQL中模拟事务安全的SEQUENCE

mysql

我们将MySQL与InnoDB存储引擎和事务一起大量使用,并且遇到了一个问题:我们需要一种很好的方法来在MySQL中模拟Oracle的SEQUENCE。要求是:-并发支持-
事务安全-最大性能(意味着最小化锁和死锁)

我们不在乎是否不会使用某些值,即顺序上的间隔是可以的。有一个简单的方法来存档,即通过创建一个带有计数器的单独的InnoDB表,但这意味着它将参与事务并引入锁和等待。我正在考虑尝试使用具有手动锁,其他任何想法或最佳做法的MyISAM表?


阅读 433

收藏
2020-05-17

共1个答案

一尘不染

如果自动增量不足以满足您的需求,则可以使用 n个 命名序列创建原子序列机制,如下所示:

创建一个表来存储序列:

CREATE TABLE sequence (
  seq_name varchar(20) unique not null,
  seq_current unsigned int not null
);

假设您在表中有一行“ foo”,则可以自动获取下一个序列ID,如下所示:

UPDATE sequence SET seq_current = (@next := seq_current + 1) WHERE seq_name = 'foo';
SELECT @next;

无需锁。这两个语句都需要在同一会话中执行,以便在发生选择时实际定义局部变量@next。

2020-05-17