2012-02-11 178 views
3

我的腳本從文件讀取MYSQL UPDATE查詢,然後應該使用autocommit = 0立即執行它們。但是,如果我刪除conn.commit()它仍然會一個一個運行,儘管我沒有提交。錯誤在哪裏? python pymysql設置autocommit false失敗

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() 
+0

是我的代碼上面正確的? – user670186 2012-02-12 02:31:02

回答

4

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

+0

謝謝。我有一個MyISAM引擎。我可以轉換它,還是必須使用不同的引擎創建新的數據庫/表並導入數據? – user670186 2012-02-11 17:14:10

+0

[ALTER TABLE t1 ENGINE = InnoDB:](http://dev.mysql.com/doc/refman/5.1/en/alter-table.html) – danihp 2012-02-11 17:16:34

+0

這樣做但仍不起作用。仍然依次運行每個查詢 – user670186 2012-02-11 17:18:19