我有一个存储记录的数据库表A,A有一个带auto_increment的主键(recordid),每次我将记录插入A,我得到插入的记录并将其存储在另一个masterTable中。
我正在使用select语句,我很快就插入A来获取这样的记录:
通过recordid DESC LIMIT 1从A订单中选择recordid;
但是我今天遇到了一个问题,在同一时间插入了两个记录(由不同的线程),我最终在主id中存储了错误的记录ID(两个txns的记录都相同)
我听说过Statement.getGeneratedKeys(),我想知道这是否真的有助于解决问题。或者处理这个问题的最佳方法是什么。
答案 0 :(得分:8)
您可以使用getGeneratedKeys方法。这个forum post会有所帮助。
我还建议您使用Hibernate之类的ORM工具。在Hibernate中你会做这样的事情:
myTable = new myTable();
myTable.prop1 = prop1;
myTable.prop2 = prop2;
int id = session.save(myTable);
Hibernate将发出相应的SQL命令(取决于所选的数据库)并返回自动生成的id。
答案 1 :(得分:3)
MySQL JDBC驱动程序支持getGeneratedKey()
方法。请查看MySQL手册的20.3.5.1.4. Retrieving AUTO_INCREMENT Column Values部分:
我们演示了如何使用新的JDBC-3.0方法
getGeneratedKeys()
,如果需要检索AUTO_INCREMENT键,它现在是首选方法。
答案 2 :(得分:1)
在不支持generatedKeys的数据库中,您可以将ID转换为返回参数。例如,Oracle提供RETURNING xxx INTO?语法,其中xxx是您的列名。