【问题标题】:Concurrency safe access to database in golang并发安全访问golang中的数据库
【发布时间】:2019-06-28 21:44:44
【问题描述】:

我需要一些关于并发工作数据库 golang 的建议。例如,我有付款信息的数据库。如果它有超过 1 个始终更新数据库的连接,我如何获得有关付款的实际信息?

我尝试将事务与 gorm 一起使用,但我不确定它是否有效。我也在尝试使用互斥锁,但如果我的应用程序有超过 1 个实例,它就不能正常工作。我也在尝试使用像更新付款集 someinfo = someinfo || 这样的 sql某些条件的“附加信息”。

【问题讨论】:

标签: sql go concurrency


【解决方案1】:

有两个组件需要考虑:

go语言客户端的线程安全

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

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,我们显然希望第二笔交易开始 帐户行的更新版本。因为每个命令都是 只影响预定的行,让它看到更新的版本 的行不会造成任何麻烦的不一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多