本问题已经有最佳答案,请猛点这里访问。
我有一个存储记录的数据库表A,A有一个具有auto_increment的主键(recordid),每次将记录插入A时,我都会获取插入的recordid并将其存储在另一个masterTable中。
我在向A进行插入以获取如下记录ID时就使用了select语句:
通过记录ID DESC LIMIT 1从A订单中选择记录ID;
但是我今天遇到了一个问题,其中同时(通过不同的线程)插入了两个记录,而我最终在主ID(两个txns的相同recordid)中存储了错误的recordid。
我听说过Statement.getGeneratedKeys(),我想知道这是否真的有助于解决问题。 或处理此问题的最佳方法是什么。
您可以使用getGeneratedKeys方法。 该论坛帖子将有所帮助。
我是否也可以建议您使用Hibernate之类的ORM工具。 在Hibernate中,您将执行以下操作:
myTable = new myTable();
myTable.prop1 = prop1;
myTable.prop2 = prop2;
int id = session.save(myTable);
Hibernate将发出适当的SQL命令(取决于所选的数据库)并返回自动生成的ID。
如果MySQL JDBC驱动程序实现了它。
确实如此。 如果JDBC驱动程序不支持它,则需要依赖于数据库的特定方法来获取ID。
@kgiannakakis-session.save(myTable)不返回int。 但是,它返回java.io.serializable,并且到目前为止,JDBC驱动程序的任何实现都不支持getGeneratedKeys()方法。 因此,您提到的两种情况都不会很明显地成功。 他们真的工作吗?
@Lion-Integer确实实现了Serializable。 因此,使用装箱可以从session.save(myTable)中获取一个int,当然,前提是您的表映射可以返回一个int。 此方法有效。 我已经使用MySQL JDBC驱动程序成功测试了getGeneratedKeys方法。
MySQL JDBC驱动程序确实支持getGeneratedKey()方法。 请参阅第20.3.5.1.4节。 检索MySQL手册的AUTO_INCREMENT列值,其中:
we demonstrates the use of the new JDBC-3.0 method getGeneratedKeys() which is now the preferred method to use if you need to retrieve AUTO_INCREMENT keys.
在不支持generateKeys的数据库中,您可以将ID放入返回参数中。 例如,Oracle提供了RETURNING xxx INTO? 语法,其中xxx是您的列名。