Featured image of post MySQLdbでTRUNCATE TABLE文を発行したら、commitされなかったでござるの巻き

MySQLdbでTRUNCATE TABLE文を発行したら、commitされなかったでござるの巻き

Twitter ツイート Hatena Bookmark ブックマーク

本来TRUNCATEはトランザクションをサポートしてないのでcommitされないってのはおかしいですね。。。
すいません、無知なもので。。。

んでまあ前回の「mysqliでTRUNCATE TABLE文を発行したら、commitされなかったでござるの巻き」の続きなんですが、結局pythonでためしたところ同じ結果でした。

検証したコードは以下の通り。
ちゃんとpython書いたことないので糞みたいなコードでごめんなさいw

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import MySQLdb
import sys

# mysql connect
connect = MySQLdb.connect(user="root",passwd="root",db="test",charset="utf8");
connect2 = MySQLdb.connect(user="root",passwd="root",db="test",charset="utf8");


connect.cursorclass = MySQLdb.cursors.DictCursor
cursor = connect.cursor()

connect2.cursorclass = MySQLdb.cursors.DictCursor
cursor2 = connect2.cursor()

cursor.execute("SELECT name FROM `test` WHERE name IN (%s,%s)",("abc","def"));
connect2.commit();

cursor2.execute("TRUNCATE TABLE test")
connect2.commit()

cursor2.close()
cursor.close()

connect.close()
connect2.close()

やっぱ途中でレスポンスがDBから帰ってこなくなるみたいです。
queryのログは以下のようになっています。

1
2
3
4
5
6
7
Connect	root@localhost on test
Query	set autocommit=0
Connect	root@localhost on test
Query	set autocommit=0
Query	SELECT name FROM `test` WHERE name IN ('abc','def')
Query	commit
Query	TRUNCATE TABLE test

まあtruncate文なんてあまり実際のアプリの実装では使わないし、いいといえばいいんですが結構気になります。
とりあえずこれではっきりしたことは以下の通りかと思います。

  • phpのmysqliライブラリの問題ではない
  • mysqlサーバ側のプリペアードステートメントの問題ではない
  • コネクションを2つもった状態でのトランザクションの問題である

ちなみに使用しているmysqlのバージョンは以下の通り。

1
2
$ mysql --version
mysql  Ver 14.14 Distrib 5.5.25a, for osx10.7 (i386) using readline 5.1

同じDBサーバに対してのコネクションが2つにならなければ発生しない問題だと思うので、マスター/スレーブを意識したライブラリを自作して、ローカルの開発環境でマスター/スレーブの両方とも同じサーバに接続する状況ぐらいでしか問題は発生しないと思います。
でも、こういう細かいことで時間を取られて開発効率が下がるのも事実ですよね。。。。

MySQL5.5の問題なのか、それとももともとからある問題なのか調べてみてもいいかもですね。
続きはまた今度。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。