Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将sqlite用于数据库队列的最佳实践_Sqlite_Jdbc_Transactions - Fatal编程技术网

将sqlite用于数据库队列的最佳实践

将sqlite用于数据库队列的最佳实践,sqlite,jdbc,transactions,Sqlite,Jdbc,Transactions,我正在使用sqlite数据库作为生产者-消费者队列 一个或多个生产者使用新的自动递增主键一次插入一行 有一个消费者(用java实现,使用库),我希望它读取一批行并删除它们。似乎我需要事务来完成这项工作,但尝试将SQLite与事务一起使用似乎不起作用。我是不是想得太多了 如果我最终需要事务,那么在Java中正确的方法是什么 Connection conn; // assign here boolean success = false; try { // do stuff

我正在使用sqlite数据库作为生产者-消费者队列

一个或多个生产者使用新的自动递增主键一次插入一行

有一个消费者(用java实现,使用库),我希望它读取一批行并删除它们。似乎我需要事务来完成这项工作,但尝试将SQLite与事务一起使用似乎不起作用。我是不是想得太多了

如果我最终需要事务,那么在Java中正确的方法是什么

 Connection conn;
 // assign here

 boolean success = false;
 try {
    // do stuff
    success = true;
 }
 finally
 {
    if (success)
       conn.commit();
    else
       conn.rollback();
 }
有关Java JDBC事务处理的介绍,请参阅


至于您的用例,我认为您应该使用事务,特别是当消费者很复杂时。棘手的部分总是决定一行何时被使用,以及何时应该再次考虑它。例如,如果在使用者实际执行其工作之前发生错误,则需要回滚。但是,如果行包含非法数据(如数字字段中的文本),则回滚将变成无限循环。

通常,使用SQLite时存在显式(而不是隐式)事务。所以您需要类似于“启动事务”的东西,当然,您的Java绑定可能已经合并了它——但是好的绑定没有


因此,您可能需要添加必要的事务开始(您的绑定中可能有一个特殊的许可方法)。

这似乎可以做到;当我执行“BEGIN TRANSACTION”和“END TRANSACTION”SQL语句而不是使用JDBC的提交/回滚函数时,它似乎工作正常。嗨,Jason,至少您需要BEGIN TRANSACTION(在某些LIB中,有专门的方法来执行)。END TRANSACTION的结果应该与COMMIT相同。正如Juergen所指出的,begin TRANSACTION方法可以类似于
db.beginTransaction()