Java 跟踪SQL中的新主键
抱歉,这是一个很长的问题,但它涉及到数据库的一般问题: 我使用sqlite/jdbc(在本例中),并且我试图跟踪在向表中添加行时创建的自动ID。数据库有一个主表“Person”,其他表称为“training”和“inclution”。其想法是将人员姓名和其他基本细节放入“人员”表中,一人多人有许多“培训”和“入职培训”。因此,我可以通过选择*FROM inclutions,person_ID=WHERE,查找给定人员的所有入职培训 问题是在创建数据库时,我必须添加一个人,然后跟踪他们获得的自动递增ID,然后在另一个表中以该ID作为外键创建条目: 所以 然后 我希望与数据库的交互是“原子的”,所以我想做Java 跟踪SQL中的新主键,java,sql,sqlite,jdbc,transactions,Java,Sql,Sqlite,Jdbc,Transactions,抱歉,这是一个很长的问题,但它涉及到数据库的一般问题: 我使用sqlite/jdbc(在本例中),并且我试图跟踪在向表中添加行时创建的自动ID。数据库有一个主表“Person”,其他表称为“training”和“inclution”。其想法是将人员姓名和其他基本细节放入“人员”表中,一人多人有许多“培训”和“入职培训”。因此,我可以通过选择*FROM inclutions,person_ID=WHERE,查找给定人员的所有入职培训 问题是在创建数据库时,我必须添加一个人,然后跟踪他们获得的自动递
prepPerson.executeBatch();
prepInductions.executeBatch();
id++;
我意识到可以改为添加人员,执行getGeneratedKeys(),然后添加具有新人员正确行id的归纳,但我不希望在添加人员之后但在归纳之前出现异常。如果发生这种情况,那么我将不得不回滚时间并移除该人员
目前,我知道我每次都从外部源重新创建数据库,我用一个局部整数变量跟踪行id,我知道这很危险
这种情况难道没有一个普遍的解决办法吗?还是我很担心与数据库的“原子”交互?对于这样的场景,一般框架是
Begin A Transaction
Create your primary entry
Collect the auto-generated key
Create your child entries
Commit The Transaction
然后,如果任何步骤失败,您就可以回滚事务
在SQLite中,我相信last\u insert\u rowid()
可以用于在第一次插入后获取自动生成的id。请使用getGeneratedKeys()
检索生成的id
要保持数据完整性,请使用事务。通常,JDBC使用“自动提交”模式,但在这种情况下,您需要手动处理事务
在连接上调用.setAutoCommit(false)
,并使用.commit()
和.rollback()
提交或放弃更改
(检查Javadoc)。您可以使用上面提供的代码,但请确保自动提交已关闭。然后,您需要在加载该人员的所有导入后手动提交事务。或者在遇到错误时将其回滚
这是完全原子化的。请澄清一下为什么好的旧事务不适合您。AFAIK sqlite支持它们,setAutocommit(false)将隐式启动一个新事务。您是说rollback()
而不是abort()
(后者旨在强制关闭连接)?感谢大家的快速响应。它现在正在点击自动提交的内容。我在执行批处理之前将其设置为false,在执行批处理之后将其设置为true,正如一个示例所示,我没有确切地了解原因-我根本没有.commit()
,但它仍然有效。那么,一旦完成,您可以执行多个.executeBatch()
es,然后执行一个.commit()
?这正是我需要的。已解决。@Mike对处于活动事务中的连接调用autoCommit(true)
将调用commit()
(如javadoc中所述)。@Mark。是的,这似乎很有效。(还有,刚刚学会了关闭结果集的缓慢方法。)再次感谢大家。
prepPerson.executeBatch();
prepInductions.executeBatch();
id++;
Begin A Transaction
Create your primary entry
Collect the auto-generated key
Create your child entries
Commit The Transaction