【发布时间】:2015-09-01 13:00:28
【问题描述】:
假设我们有以下伪python代码来处理Mysql:
with connection.cursor() as cursor:
sql = "SELECT `count` FROM `sometable` WHERE `name`=%s"
cursor.execute(sql, ('somename',))
result = cursor.fetchone()
if result['count'] == 1:
sql = "UPDATE `sometable` SET `count`=%d WHERE `name`=%s"
cursor.execute(sql, (10, 'somename'))
connection.commit()
我知道事务将提供一个“全有或全无”的命题,但不知道如果与应用程序代码混合它是如何工作的。数据库事务如何处理应用代码如:if result['count'] == 1.
据我了解,当提交时,所有的 sql 都会被处理到数据库服务器执行,服务器会确保 sql 执行“all-or-nothing”。但是上面的代码应该只在count等于1时执行UPDATE sql。如果所有 sql 都已经处理到数据库服务器并且其他一些事务只是更改了count,会发生什么?
【问题讨论】:
-
我怀疑你真的在问事务是否会阻止竞争条件。如果这是您真正的问题,请参阅 Do database transactions prevent race conditions?。
-
@MartijnPieters,你是对的,你给我的链接刚刚解释了。
标签: python mysql sql transactions