python如何看到另一个客户机对mariadb所做的更改?

k5ifujac  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(366)

在我的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() ? 这是一个错误/不便还是一个功能?
或者是我错过了什么?

4si2a6ki

4si2a6ki1#

线程写入问题 COMMIT 写完之后。做 COMMIT 在阅读线程中没有效果。
我不会更改“隔离级别”,除非您需要让读者看到正在发生的未完成的更改。这通常不是必需的。
所以,作者应该 COMMIT 一旦它完成了某个单位的工作。那可能是一个 INSERT ; 这可能是一个漫长、复杂的操作组合。一个简单的例子是经典的“资金转移:

BEGIN;
UPDATE accounts SET balance = balance + 100 WHERE id = 123; -- my account
UPDATE accounts SET balance = balance - 100 WHERE id = 432; -- your account
COMMIT;

为了保证 accounts 两个都要 UPDATEs 要么发生要么不发生,即使系统在中间崩溃。你不想让其他线程看到 balance 如果它在中间读取数据。
另一种表达方式是:作者负责说“我完了”(打电话) commit ).

ep6jt1vc

ep6jt1vc2#

正如@brunodesshuilliers所指出的,答案似乎在隔离级别。python的默认值似乎是 REPEATABLE READ . 要始终读取最新提交,必须更改事务的隔离级别,例如 READ COMMITTED .

config = {'user'    : 'some_user',
          'password': 'some_password',
          'host'    : '127.0.0.1',
          'database': 'some_database',
          'raise_on_warnings': True,
         }
db = mysql.connector.connect(**config)
cursor = db.cursor()
cursor.execute('SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;')
cursor.close()

# wait some to make changes to the database using the HeidiSQL workbenches

cursor = db.cursor()
cursor.execute('some_SQL_query') # will now read the last committed data
for result in cursor:
    do_something_with(result)
cursor.close()

相关问题