在MySql中以原子方式获取并增加序列值

时间:2011-03-31 16:15:28

标签: java mysql hibernate sequence

我将数据库从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使用此表生成一个新序列,但在某些情况下我需要手动执行。

对我来说,最好的解决方案是对上述方法进行重构,以便同时查询表的线程不会失败,但会相互等待。

...谢谢

1 个答案:

答案 0 :(得分:0)

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