【问题标题】:python pymysql set autocommit false failspython pymysql set autocommit false 失败
【发布时间】:2012-02-11 16:43:32
【问题描述】:

我的脚本从文件中读取 MYSQL UPDATE 查询,然后应该使用 autocommit = 0 立即执行它们。但是,如果我删除 conn.commit(),它仍然会一一运行,尽管我没有提交。错误在哪里?

import pymysql
conn = pymysql.connect(host='x', unix_socket='/tmp/mysql.sock',user='x', passwd='x', db='x')
fileHandle = open ( 'mysqlout.txt' )
fileList = fileHandle.readlines()
fileHandle.close()
i = 1
weiter = input("Execute MYSQL file? ")
if (weiter == 'y'):
    cur = conn.cursor()
    cur.execute('SET autocommit = 0')
    conn.commit()
    for fileLine in fileList: #-----each line is an UPDATE...query
        cur.execute(fileLine)
        i = i + 1
        print(i," ---",round(i / len(fileList),3))
#conn.commit()
conn.close()

【问题讨论】:

  • 我上面的代码完全正确吗???

标签: python mysql autocommit


【解决方案1】:

MySQL 中的 MyISAM 存储引擎不支持事务。只有 InnoDB 支持 ACID 事务。

引用Transactions and Atomic Operations MySQL documentation

在事务方面,MyISAM 表总是有效地在 自动提交 = 1 模式。

你应该check storage engine for your tables:

mysql> SELECT table_name,engine FROM INFORMATION_SCHEMA.TABLES 
       WHERE table_schema=DATABASE();
+--------------+--------+
| table_name   | engine |
+--------------+--------+
| stats        | MyISAM |
+--------------+--------+
1 row in set (0.00 sec)

将表移动到支持事务的MySQL storage engine

【讨论】:

  • 谢谢。我有一个 MyISAM 引擎。我可以转换它还是必须使用不同的引擎创建一个新的数据库/表并导入数据?
  • 做到了,但还是不行。仍然一个一个地运行每个查询
  • 你如何测试它?您可以修改您的 python 脚本并在最后一次提交之前放置一个a=raw_imput("import in pause to check transaction")?当脚本暂停时,您可以测试事务。
  • 脚本暂停时如何测试事务?
猜你喜欢
  • 1970-01-01
  • 2021-08-15
  • 2014-06-09
  • 1970-01-01
  • 2019-04-09
  • 2012-10-21
  • 2011-01-17
  • 1970-01-01
  • 2019-12-12
相关资源
最近更新 更多