当前位置: 首页 > 面试题库 >

在MySQL中模拟事务安全的SEQUENCE

韩涵衍
2023-03-14
问题内容

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

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


问题答案:

如果自动增量不足以满足您的需求,则可以使用 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。



 类似资料:
  • 本文向大家介绍MySQL安全策略(MySQL安全注意事项),包括了MySQL安全策略(MySQL安全注意事项)的使用技巧和注意事项,需要的朋友参考一下 导读 MySQL被运用于越来越多的业务中,在关键业务中对数据安全性的要求也更高,如何保证MySQL的数据安全? 数据安全如果只靠MySQL应用层面显然是不够的,是需要在多个层面来保护的,包括网络、系统、逻辑应用层、数据库层等。 下面是我们可借鉴的一

  • 问题内容: 我想找到一种优雅的方法来模拟Postgres中MySQL的subtring_index()函数的行为。 在MySQL中,它很简单: 但是我目前在PGSQL上的工作非常丑陋: 也许有使用正则表达式的更优雅的解决方案,或者甚至将字符串拆分为一个变量数组,如果该字符串是从子查询或其他内容派生的,则可以减少开销,我欢迎提出任何建议。 问题答案: 总是花时间浏览手册。 http://www.po

  • 问题内容: 我有一位表格讲师,我想删除工资范围在一定范围内的记录。一种直观的方式是这样的: 但是,在安全模式下,如果不提供主键(ID),则无法删除记录。 所以我写下面的sql: 但是,有一个错误: 我很困惑,因为当我写 它不会产生错误。 我的问题是: 此错误消息的真正含义是什么,为什么我的代码是错误的? 如何重写此代码以使其在安全模式下工作? 谢谢! 问题答案: 到处搜寻,最流行的答案似乎是“只关

  • 问题内容: 最近,在一个用于mysql数据库的PHP脚本中,我需要在恰好位于另一个事务内部的某个位置使用事务。我所有的测试似乎都表明这很好,但是我找不到有关此用法的任何文档。 我想确定-交易中的交易在mysql中是否有效?如果是这样,是否有办法找出嵌套事务中的层数?(即恢复到正常状态需要多少回滚) 预先感谢,Brian 问题答案: 手册的本页可能使您感兴趣: 12.3.3。 导致隐性提交的陈述 ;

  • 问题内容: 根据Google搜索:由于MySQL不支持完全外部联接,因此可以通过union和/或union all模拟它。但是,这两者要么删除正版副本,要么显示伪造副本。 什么是正确有效的方式? 这个问题似乎相关,但无法获得答案。 问题答案: 您可以使用左联接和右联接: 在Wikipedia上也有关于此主题的一些信息:完全外部联接。 维基百科文章建议在MySQL中使用UNION。这比UNION A