我需要有关并发工作数据库golang的一些建议。例如,我的数据库中有付款信息。如果它有多个连接并一直在更新数据库,我如何获得有关付款的实际信息?
我试图在gorm中使用事务,但是我不确定它的工作与否。我也试图使用互斥锁,但是如果我的应用程序有多个实例,它将无法正常工作。我也试图像更新付款集这样使用sql someinfo = someinfo || “附加信息”在某些情况下。
答案 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,我们显然希望第二笔交易以 帐户行的更新版本。因为每个命令都是 仅影响预定行,使其看到更新的版本 该行不会造成任何麻烦的不一致。