不支持事务

    后面这部分有问题的代码,在没有并发的场景下使用,是不会有任何问题的。但是这段代码在高并发应用场景下,错误百出。你会发现最后执行结果完全摸不清楚。明明是个转账逻辑,一个收入,一直支出,最后却发现总收入比支出要大。如果这个错误发生在金融领域,那不知道要赔多少钱。

    如果你能靠自己很快明白错误的原因,那么恭喜你你对数据库连接 Nginx 机理都是比较清楚的。如果你想不明白,那就听我给你掰一掰这面的小知识。

    但如果你创建了两条连接,每条连接提交的 SQL 语句是下面这样:

    这时就会出现连接 1 的内容没有被提交,行锁产生。连接 2 提交了一个空的 。

    或许你不会主动、显示的创建多个连接,但是刚刚的示例代码,高并发下这个事物的每个 SQL 语句都可能落在不同的连接上。为什么呢?这是因为通过 ngx.location.capture 跳转到 /postgres 小节后,Nginx 每次都会从连接池中挑选一条空闲连接,而当时哪条连接是空闲的,完全没法预估。所以上面的第二个例子,就这么静悄悄的发生了。如果你不了解 的机理,那么他肯定会一直困扰你。为什么一会儿好,一会儿不好。

    同样的道理,我们推理到 DrizzleNginxModuleRedisNginxModuleRedis2NginxModule,他们都是无法做到在两次连续请求落到同一个连接上的。