Pad*_*lin 13 mysql mysql-python
我正在使用MySQLdb模块从python使用MySQL 5.0.
考虑一个简单的函数来加载和返回整个数据库表的内容:
def load_items(connection):
cursor = connection.cursor()
cursor.execute("SELECT * FROM MyTable")
return cursor.fetchall()
Run Code Online (Sandbox Code Playgroud)
此查询旨在成为一个简单的数据加载,并且除了该单个SELECT语句之外没有任何事务行为.
在运行此查询之后,可能需要一段时间再次使用相同的连接来执行其他任务,尽管其他连接仍然可以同时在数据库上运行.
我应该在通话connection.commit()后尽快cursor.execute(...)打电话,以确保操作未在连接上留下未完成的交易吗?
a_h*_*ame 13
您需要考虑以下两件事:
MySQL中的默认隔离级别REPEATABLE READ意味着如果SELECT在事务内部运行两次,即使其他事务已提交更改,您也会看到完全相同的数据.
大多数时候,人们希望在运行第二个select语句时看到提交的更改 - 这是READ COMMITTED隔离级别的行为.
如果您没有更改MySQL中的默认级别,并且如果您在同一事务中运行SELECT两次,您确实希望看到数据库中的更改 - 那么您不能在"相同"事务中执行此操作并且您需要提交第一个SELECT声明.
如果你真的想看到您的交易数据的一致状态,那么你应该没有明显犯.
几分钟后,第一个进程执行一个事务性操作并尝试提交.这个提交会失败吗?
这完全取决于你对" 交易 "的定义.你在关系数据库中所做的任何事情都是"事务性的"(实际上对于MySQL来说并不完全正确,但是为了论证,如果你只使用InnoDB作为你的存储引擎,你可以假设这一点).
如果"第一个进程"仅选择数据(即"只读事务"),那么当然提交将起作用.如果它试图修改另一个事务已经提交的数据并且您正在运行,则REPEATABLE READ可能会收到错误(在等待任何锁定释放之后).在这种情况下,我不是100%关于MySQL的行为.
您应该使用您喜欢的SQL客户端手动尝试使用两个不同的会话来了解行为.也要改变你的隔离级别,以便看到不同级别的效果.
| 归档时间: |
|
| 查看次数: |
6176 次 |
| 最近记录: |