在MySql中模拟序列

时间:2014-06-30 16:22:22

标签: java mysql sql multithreading sequences

我正在尝试模拟MySql中的序列。我已经阅读了SO和其他一些关于如何做到这一点的建议。我相信我做得对。我有一个更新语句,它增加了我的序列表中的列,如下所示:

query = "UPDATE sequence SET id = LAST_INSERT_ID(id + 1) WHERE sequence_id = 'MySequenceName'";
int rowsUpdated = statement.executeUpdate(query);

然后在成功更新后,我通过" SELECT LAST_INSERT_ID()"检索序列值。

这很有效,直到系统负载很重。当负载很重时,我有时会得到一个零值作为rowsUpdated值。我假设这是因为两个线程同时进行更新。我认为每个线程获取相同的id值,递增它,然后更新sequence_id具有相同的值。因此,线程1会将rowsUpdated设置为1,但由于线程2使用相同的值进行更新,因此不会进行任何更改,并且线程2的rowsUpdated为0。

我正在运行MySql 5.1版。我在连接上的事务级别是READ_COMMITTED。列' sequence_id'是桌子上的主键。我为每个线程使用单独的连接。奇怪的是,我有几个这样的代码安装,虽然负载很重,但没有遇到这个问题。我正在考虑在这个网站上升级MySql的版本,但我还没有看到任何关于这个问题的讨论。

认为update语句应该将表行PRIOR锁定为读取id,递增它并进行更新是不正确的吗?

0 个答案:

没有答案