Python如何看到其他客户端对MariaDB所做的更改?

时间:2018-07-16 10:53:43

标签: python mysql mariadb commit

在Windows计算机上,我在MariaDB(10.3.7)上有一个非常简单的数据库,可与mysql-connector-python-rf(2.2.2)连接。

我还使用2个HeidiSQL工作台实例连接到数据库。

当我使用一个工作台在数据表中添加或删除行时,可以立即在另一个工作台中使用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()还读取自上一个connect()以来其他客户端所做的更改是否正确?这是错误/不便还是功能?

还是我想念的其他事情在这里?

2 个答案:

答案 0 :(得分:0)

正如@brunodesthuilliers指出的那样,答案似乎在隔离级别。 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()

答案 1 :(得分:0)

线程写入在写入后发出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)。