Sequel(Ruby),如何以安全的方式递增和使用DB计数器?
我找到了4种“正确”的方法:Sequel(Ruby),如何以安全的方式递增和使用DB计数器?,ruby,atomic,sequel,Ruby,Atomic,Sequel,我找到了4种“正确”的方法: 在ActiveRecord的increment和increment\u计数器的替代品中,increment和album.update的值[:column]=1或+=1(:counter\u name=>Sequel.+(:counter\u name,1)) 在update\u中,建议使用sql以实现相同的效果s[:query\u volume]。update\u sql(:querys=>Sequel.expr(3)+:querys) 在一个数据库中,我找到了这个
increment
和increment\u计数器
的替代品中,increment和album.update的值[:column]=1或+=1(:counter\u name=>Sequel.+(:counter\u name,1))
update\u中,建议使用sql
以实现相同的效果s[:query\u volume]。update\u sql(:querys=>Sequel.expr(3)+:querys)
dataset.update\u sql(:exp=>'exp+10'.lit)
http://sequel.jeremyevans.net/rdoc/classes/Sequel/Dataset.html#method-i-update
Sequel.expr
和Sequel.+
实际上并不返回值,而是返回一个Sequel::SQL::NumericExpression
和(afaik)如果不进行另一次DB往返,您将无法得到它,这意味着可能发生这种情况:
ActiveRecord
和Sequel
——在我的情况下,我同时使用了这两种方法——可能需要重新启动服务器才能注册商户)
Redis可以做到这一点,但当您坐在符合ACID标准的数据库上时,仅为计数器添加另一个基础结构组件似乎很疯狂。答案是-在多线程环境中,不要使用DB计数器。当面临此难题时:
我想不出另一种方法。我从未使用过POS系统,但我所使用的电信网络供应系统通常使用一个事务生成器服务,该服务根据需要命名ID。如果您使用的是PostgreSQL,则可以使用更新返回:
DB[:table]。返回(:counter)。更新(:counter=>Sequel.expr(1)+:counter)
但是,如果不支持更新返回或类似操作,就无法在返回递增值的同时自动递增。@bbozo回应。希望有经验的人能在这里帮助您:)这样“安全地维护许多计数器”太疯狂了一直是2016年的难题哇,你好:D谢谢:D在我的情况下就可以了:)如果有一个通用的方法就好了。