Sqlite3で、alter table をトランザクション内で操作できた

テーブル操作系の処理は、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をより好きになりました。

#仕事に戻ろう。

2件のコメント

  • こちらも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というので苦労した覚えが。。。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください