我正在使用sqlite数据库作为生产者 - 消费者队列。
一个或多个生产者使用新的自动增量主键一次INSERT一行。
有一个使用者(在java中实现,使用sqlite-jdbc库),我希望它读取一批行并删除它们。似乎我需要事务来执行此操作,但尝试将SQLite与事务一起使用似乎无法正常工作。我是否想过这个?
如果我最终需要进行交易,那么在Java中执行此操作的正确方法是什么?
Connection conn;
// assign here
boolean success = false;
try {
// do stuff
success = true;
}
finally
{
if (success)
conn.commit();
else
conn.rollback();
}
答案 0 :(得分:3)
有关使用Java JDBC进行事务处理的介绍,请参阅this trail。
至于你的用例,我认为你应该使用交易,特别是如果消费者很复杂的话。棘手的部分总是决定何时消耗了一行以及何时应该再次考虑它。例如,如果在消费者实际完成其工作之前遇到错误,则需要回滚。但如果该行包含非法数据(如数字字段中的文本),则回滚将变为无限循环。
答案 1 :(得分:1)
通常,SQLite有明确的(非隐式!)事务。所以你需要像“START TRANSACTION”这样的东西,它可能是你的Java绑定已经合并了 - 但好的绑定没有。
所以你可能想要添加必要的事务开始(你的绑定中可能有一个特殊的方法)。