我需要一些关于并发工作数据库的建议。例如,我有数据库支付信息。我如何才能得到付款的实际信息,如果它有超过一个连接,所有的时间更新数据库?
我试图使用与gorm的交易,但我不确定它的工作是否有效。另外,我正在尝试使用互斥,但如果我的应用程序有超过一个实例,它就不能正常工作。另外,我还试图使用sql,比如更新支付集,在其中有一些条件。
发布于 2019-06-28 13:39:22
在这方面,有两个组成部分需要考虑:
线程- go语言客户端的安全性
第一个需要审计,希望通过社区很容易找到这些信息,而不必进入代码级别的审核。我看到并发(线程)安全是在正式的go文档中提到了一些摘要,所以从语言级别(go)的角度来看,应该很容易找到哪些结构和方法是安全的。
第二是考虑如何进入数据库,以及特定DB提供的保证(以及普通分布式系统的乐趣:) postgres/mysql的默认隔离级别允许两个并发读取来查看相同的数据,然后让每个数据覆盖另一个(在写入时)。postgres文档提供了一个这个例子很好的例子
由于上面的规则,更新命令可以看到不一致的快照:它可以看到并发更新命令对它试图更新的同一行的影响,但它看不到这些命令对数据库中其他行的影响。这种行为使得读提交模式不适用于涉及复杂搜索条件的命令;然而,它正好适合于更简单的情况。例如,考虑使用以下交易更新银行余额:
BEGIN;
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345;
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 7534;
COMMIT;如果两个这样的事务同时尝试更改帐户12345的余额,我们显然希望第二个事务从帐户行的更新版本开始。因为每个命令只影响预定的行,所以让它看到行的更新版本不会造成任何麻烦的不一致。
https://stackoverflow.com/questions/56803984
复制相似问题