[PHP-users 22997]Re: MYSQLトランザクション

SAITO Masaru daisaito @ lares.dti.ne.jp
2004年 8月 17日 (火) 20:51:46 JST


齋藤@横浜です。

> 斉藤様、どうもありがとうございます!
> ただ、下記スクリプトを試してみたのですが、
> エラーとなるSQL文が逆になった場合、つまり、
> 一個目が正常に動き、二個目のがエラーになった場合、
> 一個目は反映されてしまいました。
> これだと、どうもロールバックできてないみたいです。
> 何が悪いんでしょうか。。

えーと、、そもそもInnodbを『ちゃんと』使える環境に
SETUPし直したんでしょうか?

たまたま私の手元にあるマシンがちょうどよい環境だったので試してみました。
この環境はdbd option付きでconfigureしていますが、
innodbは組み込んでいません。それを踏まえた上でご覧下さい。
(このメールの下部に貼り付けました。)

とりあえず結果からいうと単にcreate tableでinnodbを指定しただけでは
ダメでちゃんとinnodbを使えるようにリコンパイルしないとinnodbは使えません。
もちろんbdbも同じです。
# 私の環境はbdbが組み込んである為にrollbackできたんですよ!
# これを見てinnodbをbdbに変えればいいなんて考えないで下さいね!!

まずはPHPで確かめる前にmysqlコンソールで下記と同じような実験をして
それからその結果をちゃんと確かめる方が先だと思います。

という事を[PHP-users 22988]で秋本さんがおっしゃっておりますが、
このメールは黙殺したんですか??
# ちなみにmysql "Max" でなくてもちゃんとconfigureオプションで
# 指定して、必要な環境が(dbdの場合はbdbのライブラリが必要)あれば
# 作れます。



mysql> select version();
+-----------+
| version() |
+-----------+
| 3.23.56   |
+-----------+
1 row in set (0.00 sec)

mysql> create table innodb_t (val int) type=innodb;
Query OK, 0 rows affected (0.04 sec)
# ↑innodb_t は type=innodb をつけてcreateした。
# !!! innodbは使えないはずなのにエラーは出なかった !!!

mysql> create table bdb_t (val int) type=bdb;
Query OK, 0 rows affected (0.18 sec)
# ↑bdb_t は type=bdb をつけてcreateした。
# これは正常

# ↓両方のtableに1レコード登録
mysql> insert into innodb_t values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into bdb_t values(1);
Query OK, 1 row affected (0.01 sec)

# トランザクション開始(まずはinnodb_tから)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update innodb_t set val=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from innodb_t;
+------+
| val  |
+------+
|    2 |
+------+
1 row in set (0.00 sec)

mysql> rollback;
ERROR 1196: Warning:  Some non-transactional changed tables couldn't be rolled back
# ↑ トランザクションできんと怒られた

# トランザクション開始(次にdbd_tでリトライ)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update bdb_t set val=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from bdb_t;
+------+
| val  |
+------+
|    2 |
+------+
1 row in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
# ↑ エラーが出ない

mysql> select * from bdb_t;
+------+
| val  |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
# ↑ちゃんとrollbackできてる。





---
SAITO Masaru <daisaito @ lares.dti.ne.jp>




PHP-users メーリングリストの案内