在我的windows机器上,我在mariadb(10.3.7)上有一个非常简单的数据库,我用mysql连接器pythonrf(2.2.2)连接到这个数据库。
我还通过heidisql workbench的两个示例连接到数据库。
当我使用其中一个工作台在数据表中添加或删除一行时,我可以使用另一个工作台中的select语句立即访问更改的数据。我的结论是:第一个工作台已经将更改提交给了数据库。
然而,看到python中的变化似乎更为复杂。我得加一个 commit()
在查询以查看更改之前:
config = {'user' : 'some_user',
'password': 'some_password',
'host' : '127.0.0.1',
'database': 'some_database',
'raise_on_warnings': True,
}
db = mysql.connector.connect(**config)
# wait some to make changes to the database using the HeidiSQL workbenches
db.commit() # even though Python has not changed anything which needs to be
# committed, this seems necessary to re-read the db to catch
# the changes that were committed by the other clients
cursor = db.cursor()
cursor.execute('some_SQL_query')
for result in cursor:
do_something_with(result)
cursor.close()
到目前为止我还以为 commit()
用于提交python希望对数据库所做的更改。
这样说对吗 commit()
还将自上一次更新以来其他客户端所做的更改读取到python中 connect()
? 这是一个错误/不便还是一个功能?
或者是我错过了什么?
2条答案
按热度按时间4si2a6ki1#
线程写入问题
COMMIT
写完之后。做COMMIT
在阅读线程中没有效果。我不会更改“隔离级别”,除非您需要让读者看到正在发生的未完成的更改。这通常不是必需的。
所以,作者应该
COMMIT
一旦它完成了某个单位的工作。那可能是一个INSERT
; 这可能是一个漫长、复杂的操作组合。一个简单的例子是经典的“资金转移:为了保证
accounts
两个都要UPDATEs
要么发生要么不发生,即使系统在中间崩溃。你不想让其他线程看到balance
如果它在中间读取数据。另一种表达方式是:作者负责说“我完了”(打电话)
commit
).ep6jt1vc2#
正如@brunodesshuilliers所指出的,答案似乎在隔离级别。python的默认值似乎是
REPEATABLE READ
. 要始终读取最新提交,必须更改事务的隔离级别,例如READ COMMITTED
.