在 MySql 中自动获取并增加序列值

发布于 2024-10-28 04:34:43 字数 696 浏览 3 评论 0原文

我将数据库从 Oracle 转换为 MySQL。 我同时使用 Java 和冬眠。 当我使用 Oracle 时,我有以下方法为我提供了一个全新且未使用的序列值:

protected int getSequenceNextValue() {
    Session session = sessionFactory.getCurrentSession();
    Query query = session.createSQLQuery("select MY_SEQUENCE.NEXTVAL from DUAL");
    return ((BigDecimal) query.uniqueResult()).intValueExact();
}

并且我正在尝试重构此方法以在 MySQL DB 上工作。 我在 MySQL 中有一个表,我将其用作序列(通过 Hibernate):

create table MY_SEQUENCE(
    next_val int(10) NOT NULL
);

是否有任何线程安全的方法可以从该表中获取新值并在同一事务中增加它?

在大多数情况下,我使用 Hibernate Generator 使用此表生成新序列,但在某些情况下,我需要手动执行此操作。

对我来说最好的解决方案是重构上面的方法,这样同时查询表的线程就不会失败,而是会互相等待。

谢谢...

I convert the DB from Oracle to MySQL.
I'm using both Java & Hibernate.
When I used oracle I had the following method that gave me a brand new and unused sequence value:

protected int getSequenceNextValue() {
    Session session = sessionFactory.getCurrentSession();
    Query query = session.createSQLQuery("select MY_SEQUENCE.NEXTVAL from DUAL");
    return ((BigDecimal) query.uniqueResult()).intValueExact();
}

And I'm trying to refactor this method to work on MySQL DB.
I have a table in MySQL that I use as a sequence (through Hibernate):

create table MY_SEQUENCE(
    next_val int(10) NOT NULL
);

Is there any thread safe way to get a new value from this table and in the same transction to increase it?

For most cases I use the Hibernate Generator to generate a new sequence using this table, but in several cases I need to do it manually.

The best solution for me will be a refactoring of the method above, in such way that threads that querying the table at the same time will not fail, but will wait for each other.

Thanks...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

人心善变 2024-11-04 04:34:43

查看 InnoDB 表类型和 FOR UPDATE。与您描述的类似的示例位于 MySQL 手册中 http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

Have a look at the InnoDB table type and FOR UPDATE. An example similar to what you describe is in the MySQL manual here http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文