【发布时间】:2020-05-31 04:49:20
【问题描述】:
我正在制作这个应用程序,它可以从数据库读取和写入数据,并且可以被多个用户访问。为了避免并发问题,我使用互斥锁。我使用的数据库是 postgresql。它的文档说它符合 ACID 并提供各种级别的同步,例如 read_committed 等。所以我可以避免使用互斥锁并将我的所有语句放在一个事务块中,数据库会处理它。但我对使用这种基于事务的方法并不完全有信心,因为我对数据库自动机制存在信任问题。
我目前的做法:
mutex.lock();
\\perform database operations
mutex.unlock();
替代方法:
begin transaction
\\perform database operations
end transaction
使用互斥体处理是否明智,还是应该依赖数据库机制。 每个用户都在一个单独的线程中访问数据库。并且数据库操作很简单。一读一写。就是这样。
【问题讨论】:
-
Mutex 是应用程序级别,而不是数据库级别。它不保证多个进程中的多个 DB 语句 之间的有效 DB 原子性(或者如果没有一致使用)。根据需要使用 DB 事务 进行有效操作。 RDBMS 锁和升级已经很好地开发了。应用程序还可以执行自己的锁定和防护;它应该是次要性质,而不是取代正确的数据库用法。
-
原子性我正在通过 try 和 catch 语句来处理。
-
再读一遍,了解互斥锁的基本限制以及为什么不能用此类替换数据库级事务。
-
(但是,嘿,做你想做的事。在征求意见后,不要费心听取那些每天在复杂环境中编写此类代码的人的建议......我们中的许多人已经克服了任何“信任”问题”与关系数据库在策划理解后。)