sqlite从事务转换到保存点

noa*_*mtm 5 sql sqlite multithreading transactions savepoints

SQLite的应用程序目前使用事务 - 既可以回滚也可以提高性能.我正在考虑用保存点替换所有交易.其原因是,应用程序是多线程的(是的,sqlite配置是线程安全的),并且在某些情况下,事务可能由两个线程在同一时间开始(在同一分贝).

  1. 有理由不这样做吗?
  2. 我需要注意哪些陷阱?
  3. 难道我只是代替BEGIN,COMMIT,ROLLBACKSAVEPOINT xyz,RELEASE SAVEPOINT xyz,ROLLBACK TO SAVEPOINT xyz

Dev*_*vin 7

    It there a reason NOT to do it?
Run Code Online (Sandbox Code Playgroud)

是.它不会解决您概述的任何问题.保存点主要用于能够进行部分数据回滚.外部事务或保存点是实际提交的内容.在释放最外面的保存点之前,没有任何东西真正完全保存,因此更新了DB.您回到了与标准交易相同的问题.

    Are there any pitfalls I need to be aware of?
Run Code Online (Sandbox Code Playgroud)

是.如果您在两个不同的线程中更新相同的数据,那么多线程应用程序中的事务或保存点可以相当容易地死锁,我认为这是问题的核心.在这方面,两者没有区别.您应该知道每个线程中要更新的内容并进行相应的同步.

简而言之,除非您需要进行部分事务回滚,否则保存点实际上不会给您太多(除了它们被命名的事实.)

这里没有银弹.听起来您需要对应用程序和可能在多个线程中更新的数据进行认真分析,并在需要时在您的应用程序中添加一些同步.