我的基于sqlite的应用程序当前使用事务 – 既可以回滚也可以提高性能.我正在考虑用保存点替换所有交易.原因是应用程序是多线程的(是的,sqlite配置为线程安全的),并且在某些情况下,事务可能由两个线程同时启动(在同一个db上).
>有理由不这样做吗?
>我需要注意哪些陷阱?
>我只用SAVEPOINT xyz,RELEASE SAVEPOINT xyz,ROLLBACK SAVEPOINT xyz替换BEGIN,COMMIT,ROLLBACK吗?
解决方法
It there a reason NOT to do it?
是.它不会解决您概述的任何问题.保存点主要用于能够进行部分数据回滚.外部事务或保存点是实际提交的内容.在释放最外面的保存点之前,没有任何东西真正完全保存,因此更新了DB.您回到了与标准交易相同的问题.
Are there any pitfalls I need to be aware of?
是.如果您在两个不同的线程中更新相同的数据,那么多线程应用程序中的事务或保存点可以相当容易地死锁,我认为这是问题的核心.在这方面,两者没有区别.您应该知道每个线程中要更新的内容并进行相应的同步.
简而言之,除非您需要进行部分事务回滚,否则保存点实际上不会给您太多(除了它们被命名的事实.)
这里没有银弹.听起来您需要对应用程序和可能在多个线程中更新的数据进行认真分析,并在需要时在您的应用程序中添加一些同步.