okkyの日記: ROLLBACKの範囲を事前に指定しないといけない 1
なんかコメントが書けないので。
http://srad.jp/~dzr/journal/507291
dzrさんの日記
昔々、考えた事がある。似たようなものを。簡単に実装する方法を。思いついたのはこう。
1) BEGIN; の部分で gcore のようなものを使って、メモリダンプを吐く
2) COMMIT; は実質何もしない。メモリダンプを捨てるぐらい。
3) ROLLBACK; は 1 で吐いたメモリダンプを gdb で読み込み cont
とりあえずマニュアルでやってみた。3 をやった瞬間に暴走状態に陥った事が判った。よーく考えると当たり前。
1 の段階で gcore で吐きだしたメモリダンプの中には Instruction Pointer も含まれています。なんと私の方法は、この IP も含めてCPUまで rollback してしまったわけです。すると 1に戻り、再び演算してエラーになり…
はっはっは。馬鹿ですな。
これで判るように「全てを」巻き戻すと、『涼宮ハルヒの憂鬱 の「エンドレスエイト」』状態になるので駄目。巻き戻らないものが無くちゃいけない。それは何? という辺りを考えなくちゃいけないし、多分「巻き戻らないもの」がデフォルトで「巻き戻るのは何?」を指定する事になるだろう。
.
write(2)のようなファイル書き込みは、プログラミングレベルでは ROLLBACK できません。ROLLBACKするには、そういうプリミティブなIOは全部隠してあげて、変更は全てバックアップを取りながら…とかしなくちゃいけない。
いや、ファイルIOはまだいい。ネットワーク通信とかどうするんだ。
「さっきしゃべったの、ナシ!」
を是とするには、かなり善意にあふれたネットワーク環境を前提にしなくちゃいけない。セキュリティ的にどうよ、なデータは流せない。それってどういう世界だと役に立つんだ?
実用的なプログラミング言語、と言う事になると結構この辺りも問題になる。この辺りが問題にならないとなると、かなり研究目的の言語になっちゃう。その辺も気合が入らなかったポイント。
.
多分最終的には「どの変数とどの変数は ROLLBACK 対象」というのを宣言しなくちゃけないし、ROLLBACK inside ROLLBACK もサポートしなくちゃいけないんだろう。一方で setjmp(3)/longjmp(3) との互換性も取らなくちゃいけない。
あれば面白いとは思うが、美しいインターフェースを思いつくのが面倒。この瞬間にあきらめた、という記憶がある。
私もROLLBACKしたかったです^^; (スコア:1)
確かにご指摘の通り、私も「CPUまで rollback」する所でした^^;
(とは言うものの、私も実際そのような状況になって「…そうか!」という
アハ体験はしてみたかったです)
範囲の指定についても考えてみます。
ありがとうございました。