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