首页 > 解决方案 > 手动同步数据库操作并避免内置数据库同步机制是否明智?

问题描述

我正在制作这个应用程序,它可以从数据库读取和写入数据,并且可以被多个用户访问。为了避免并发问题,我使用互斥锁。我使用的数据库是 postgresql。它的文档说它符合 ACID 并提供各种级别的同步,例如 read_committed 等。所以我可以避免使用互斥锁并将我的所有语句放在一个事务块中,数据库会处理它。但是我对使用这种基于事务的方法并不完全有信心,因为我对数据库自动机制存在信任问题。

我目前的做法:

mutex.lock();
\\perform database operations
mutex.unlock();

替代方法:

begin transaction
\\perform database operations
end transaction

使用互斥锁处理是否明智,或者我应该依赖数据库机制。每个用户都在一个单独的线程中访问数据库。并且数据库操作很简单。一读一写。就这些。

标签: databasesynchronisation

解决方案


如果多个用户同时访问数据库,则应用程序级别的互斥锁绝对不会阻止他们在数据库端1互相踩踏。您必须使用在数据库级别(事务)提供的锁定结构来实现您所追求的。

应用程序级互斥锁的更好用例是在应用程序内运行的线程之间提供资源锁定(这也可以通过数据库事务实现,但使用正确的工具来完成这项工作)。


1:在这里我必须小心:如果应用程序在单个实例中处理多个用户,或者以其他方式在数据库之外共享数据库对象,那么互斥锁可能是进行锁定的好方法。即使那样,它也不会保护数据库上的东西(这意味着它不是内置在 DBMS 中的功能),而且让数据库处理它自己的锁可能会更好。


推荐阅读