并发安全访问golang中的数据库

时间:2019-06-28 09:05:21

标签: sql go concurrency

我需要有关并发工作数据库golang的一些建议。例如,我的数据库中有付款信息。如果它有多个连接并一直在更新数据库,我如何获得有关付款的实际信息?

我试图在gorm中使用事务,但是我不确定它的工作与否。我也试图使用互斥锁,但是如果我的应用程序有多个实例,它将无法正常工作。我也试图像更新付款集这样使用sql someinfo = someinfo || “附加信息”在某些情况下。

1 个答案:

答案 0 :(得分:2)

有两个要考虑的因素:

Go语言客户端的线程安全性

第一个要求auditing,希望可以很容易地通过社区找到此信息,而不必进行代码级审核。我看到并发(线程)安全性是mentioned for a number of the abstractions on the official go documentation,因此从语言级别的角度(去)应该容易找到哪些结构和方法可以安全地并发使用。

Database Transaction Isolation Levels

第二个考虑因素是开始进入数据库,并保证您的特定数据库提供的保证(以及仅对通用分布式系统来说很有趣:))postgres / mysql的默认隔离级别允许并发读取2次以查看相同的数据,并且然后让彼此覆盖(一次写入)。 postgres文档提供了一个excellent example of this case

  

由于上述规则,更新命令可能会   看到不一致的快照:它可以看到并发的影响   在尝试更新的同一行上更新命令,但确实如此   看不到这些命令对数据库中其他行的影响。这个   的行为使“读已提交”模式不适用于以下命令   涉及复杂的搜索条件;但是,这恰好适合   简单的情况。例如,考虑使用   像这样的交易:

BEGIN;
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345;
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 7534;
COMMIT;
  

如果两个这样的交易同时尝试更改余额   帐户12345,我们显然希望第二笔交易以   帐户行的更新版本。因为每个命令都是   仅影响预定行,使其看到更新的版本   该行不会造成任何麻烦的不一致。