原子方式读取和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发生器输出使用此表一个新的序列,但在某些情况下,我需要做手工。
对我来说,最好的解决办法将是该方法的重构上面,因为线程在同一时间查询的表不会失败这样的方式,而是将等待对方。
谢谢...
查看InnoDB表类型和FOR UPDATE。类似于你的描述的一个例子是在MySQL手册这里http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
我会阅读关于这个表类型的信息,以查看它在'普通'mySQL表中的利弊。 你能给我一些亮点吗? – user686098 2011-04-04 11:36:33
默认存储引擎是MyISAM,提供快速性能但没有交易安全性。 InnoDB提供交易安全性,允许您执行原子描述的单一逻辑操作。它还提供了其他ACID兼容功能。“启动事务”,“提交”语法对MyISAM表类型没有影响。 – rohannes 2011-04-05 11:13:07
从我读的LAST_INSERT_ID()方法不会从多个数据库会话调用时工作,所以这种解决方案并不为我工作。 – user686098 2011-04-10 16:13:04
开始交易;调用getSeqNextValue();承诺; – 2011-03-31 16:36:42