原子方式读取和MySql中

问题描述:

增加序列值我转换数据库从Oracle到MySQL。 我正在使用Java &休眠。 当我使用了Oracle,我有以下方法给了我一个全新,未使用的序列值:原子方式读取和MySql中

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

而且我想重构这个方法对MySQL数据库的工作。 我有MySQL中的表,我作为一个序列使用(通过Hibernate):

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

是否有任何线程安全的方式来获得该表,并在同一transction一个新值增加呢?

在大多数情况下,我使用Hibernate发生器输出使用此表一个新的序列,但在某些情况下,我需要做手工。

对我来说,最好的解决办法将是该方法的重构上面,因为线程在同一时间查询的表不会失败这样的方式,而是将等待对方。

谢谢...

+0

开始交易;调用getSeqNextValue();承诺; – 2011-03-31 16:36:42

查看InnoDB表类型和FOR UPDATE。类似于你的描述的一个例子是在MySQL手册这里http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

+0

我会阅读关于这个表类型的信息,以查看它在'普通'mySQL表中的利弊。 你能给我一些亮点吗? – user686098 2011-04-04 11:36:33

+0

默认存储引擎是MyISAM,提供快速性能但没有交易安全性。 InnoDB提供交易安全性,允许您执行原子描述的单一逻辑操作。它还提供了其他ACID兼容功能。“启动事务”,“提交”语法对MyISAM表类型没有影响。 – rohannes 2011-04-05 11:13:07

+0

从我读的LAST_INSERT_ID()方法不会从多个数据库会话调用时工作,所以这种解决方案并不为我工作。 – user686098 2011-04-10 16:13:04