【发布时间】:2020-08-27 17:41:12
【问题描述】:
我正在尝试为某件商品预订订单。但要做到这一点,我需要能够获取项目并锁定它们,以便在我更新或释放锁之前阻止其他并发读取和写入。保证调用 release 的方式是使用 try-finally 块。
如何在保持逻辑和数据访问关注点分离的同时阻止对表或某些行的读取和写入?
用例大致如下:
def use_case(input, repository):
validate_input(input)
try:
data = repository.get_data()
if condition1 and condition2:
update_data()
finally:
repository.unlock()
我实现存储库的方式是:
class Repository:
def get_data():
conn = adapter.connect()
cur = conn.cursor()
cur.execute('select * from table where condition')
cur.close()
conn.close()
def update():
conn = adapter.connect()
cur = conn.cursor()
cur.execute('update table set field = value where condition')
cur.close()
conn.close()
def unlock():
pass
我尝试过选择更新、显式锁定和咨询锁,但它们都在连接关闭时释放,这是正确的。
我本可以使用乐观锁定,但问题是我一次更新多个列。即使一次列的值发生变化,我也需要重新运行我的逻辑。
我创建单独连接的原因是通过仅在需要时创建它们来避免空闲连接。我不知道这是否是标准的做事方式。
【问题讨论】:
-
您的用例不清楚。如果您想锁定行的时间超过数据库连接,您如何确保行不会永远留在原地?您如何确定谁可以拨打
updata_data以及谁被锁定?请详细描述你的目标。对我来说,这看起来不像“经典选择更新问题”。 -
我试图更好地传达我的意图@LaurenzAlbe。立即检查问题
-
@LaurenzAlbe 有没有办法在不编写获取数据、验证输入和更新数据的单体应用的情况下做到这一点?
-
我不知道你所说的单体是什么意思。也就是说,我知道单体是什么,但我不明白它是如何引用你的 10 行代码的。
-
也许我基本上是想问我可以使用什么锁,它与连接无关@LaurenzAlbe。答案可能是乐观锁
标签: python database postgresql separation-of-concerns