【发布时间】:2011-12-05 11:50:50
【问题描述】:
抱歉,这是一个很长的问题,但它涉及数据库的一般问题:
我正在使用 sqlite/jdbc(在这种情况下),并且我正在尝试跟踪在向表中添加行时创建的自动 ID。该数据库有一个主表“Person”和称为“training”和“induction”的其他表。这个想法是人名和其他基本细节进入“人”表,一个人很多人有很多“培训”和“入职”。因此,我可以通过 SELECT * FROM INDUCTIONS WHERE PERSON_ID = 不管来查找给定人员的所有归纳。
问题在于创建数据库时,我必须添加一个人,然后跟踪他们获得的 AUTOINCREMENTing ID,然后在另一个表中使用该 ID 作为外键创建条目:
所以
int id = 0;
PreparedStatement prepPerson = conn.prepareStatement("insert into persons values (?, ?);");
prepPerson.setString(2, p.getName());
prepPerson.addBatch();
然后
PreparedStatement prepInductions = conn.prepareStatement("insert into inductions values (?, ?, ?, ?);");
Then loop over all the inductions {
prepInductions.setInt(2, id);
prepInductions.setString(3, i.getSite());
prepInductions.setString(4, i.getExpiryDate());
prepInductions.addBatch();
}
我希望与数据库的交互是“原子的”,所以我想做
prepPerson.executeBatch();
prepInductions.executeBatch();
id++;
我意识到可以改为添加人员,执行 getGeneratedKeys(),然后使用新人员的正确 row_id 添加归纳,但我不希望在添加人员之后但在归纳之前发生异常。如果发生这种情况,那么我将不得不回滚时间并删除此人。
目前我知道我每次都从外部源重新创建数据库,我使用本地整数变量跟踪 row_id,我知道这很危险。
这种情况没有通用的解决方案吗?还是我非常担心与数据库的“原子”交互?
【问题讨论】:
-
请澄清一下为什么好的旧交易不适合您。 AFAIK sqlite 支持它们并且 setAutocommit(false) 将隐式启动一个新事务。
标签: java sql sqlite jdbc transactions