Sqlite3で、alter table をトランザクション内で操作できた
2007/11/11
テーブル操作系の処理は、RDBによってトランザクションに入ったり入らなかったりするようです。(MySQLは入らない、PostgreSQLは入るようです)
だめもとで、sqlite3でトランザクションを開始した後にカラム追加してから、ロールバックしてみたところ元通りになってくれていました。
$ sqlite3 alter.db SQLite version 3.3.8 Enter ".help" for instructions sqlite> .explain on sqlite> create table alter_test(id integer, field1 text); sqlite> insert into alter_test (id, field1) values (1, 'aaa'); sqlite> select * from alter_test; id field1 ---- -------------- 1 aaa sqlite> alter table alter_test add column field2 text; sqlite> insert into alter_test (id, field1, field2) values (2, 'bbb', 'ccc'); sqlite> select * from alter_test; id field1 field2 ---- -------------- ---------- 1 aaa 2 bbb ccc sqlite> begin; sqlite> alter table alter_test add column field3 text; sqlite> insert into alter_test (id, field1, field2, field3) values (3, 'ddd', 'eee', 'fff'); sqlite> select * from alter_test; id field1 field2 field3 ---- -------------- ---------- ---------- 1 aaa 2 bbb ccc 3 ddd eee fff sqlite> rollback; sqlite> select * from alter_test; id field1 field2 ---- -------------- ---------- 1 aaa 2 bbb ccc sqlite>
ロールバック前に、別プロセスからselectしてもトランザクションを開始する前の状態だったので、sqlite3では、
alter table をトランザクション内で操作できるようでした。
ラッキー! sqlite3をより好きになりました。
#仕事に戻ろう。
こちらもdrop tableで試してみたんですが復活しますね・・・
PostgreSQLでもcreate tableでトランザクションに収められました。
歴史的な経緯やトランザクションの仕組みによるものなのかも知れませんね
・MySQLの3あたりまでは確かトランザクションがなかった
http://ja.wikipedia.org/wiki/MySQL#.E3.83.88.E3.83.A9.E3.83.B3.E3.82.B6.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3
OracleもDDLはトランザクションに入らなかったと思います。OracleはTransactionIsolationもほかのデータベースと違ってブチきれた覚えが・・・)
drop tableも復活するんですね。
> 歴史的な経緯やトランザクションの仕組みによるものなのかも知れませんね
そのようですね。でも影舞は、MySQLにも対応してるので、何か特別なロックとかしてるんでしょうね。また、見てみようと思います。
> OracleはTransactionIsolationもほかのデータベースと違ってブチきれた覚えが・・・)
ちょっとしたRDBの違いで嵌ると、膨大な時間を無駄にしますよねw 昔Symfowareというので苦労した覚えが。。。