@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

【データベースとファイル操作を1トランザクションでまとめる方法】

投稿者投稿内容
fight
ベテラン
会議室デビュー日: 2005/09/25
投稿数: 74
投稿日時: 2006-10-23 16:35
通常、データベースのトランザクションとファイル操作を一括りにしてロールバック等はできませんが、これを可能にする方法はありますでしょうか?
ご存知の方がいらっしゃいましたら教えていただけるとありがたいです。
よろしくお願いいたします。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-10-23 16:43
引用:

mukoubutiさんの書き込み (2006-10-23 16:35) より:
通常、データベースのトランザクションとファイル操作を一括りにしてロールバック等はできませんが、これを可能にする方法はありますでしょうか?


えっと・・ちょっと理解出来ないので確認したいのですが「ファイル操作のロールバック」というのはどういうファイル操作を対象にしていますか?ファイルの作成/削除という意味でしょうか?ファイルの読み書きですか?

#データベースに入れられないタイプの処理だとは思いますが、想像力が欠如してるので(汗
いーた
大ベテラン
会議室デビュー日: 2004/07/12
投稿数: 154
お住まい・勤務地: 東京
投稿日時: 2006-10-23 16:51
1. トランザクション開始
2. DB処理(仮にレコードINSERTとする)
3. ファイル操作(仮にファイル作成とする)
4. コミット処理

こんな感じをイメージしてますか?
3.で例外発生したら4.がロールバック処理になります。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-10-23 16:51
プラットホームはなんですか?
視野には入っているかも知れませんが、.NET Framework のトランザクションでは今のところファイルのロールバックはサポートされていません。
めだか
大ベテラン
会議室デビュー日: 2004/11/11
投稿数: 109
投稿日時: 2006-10-23 17:01
試してませんが
SQL2005のCLR-SQLを使ってファイル操作の部分を作り、
入れ子のトランザクションで実行するとロールバック
してくれるかも?
ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2006-10-23 17:09
ファイル操作って、テキストファイルの事ですかね?
Excelファイルだったら、ロールバックの場合に
ファイルセーブをしなきゃOKなんですけどね・・・
くさいだろう
会議室デビュー日: 2006/10/20
投稿数: 4
投稿日時: 2006-10-23 17:49
引用:
SQL2005のCLR-SQLを使ってファイル操作の部分を作り、入れ子のトランザクションで実行するとロールバックしてくれるかも?


してくれるわけないだろ。拡張ストアドプロシージャ(xp)でさえ、トランザクション外なんだから。
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2006-10-23 18:17
引用:

データベースのトランザクションとファイル操作を一括りにしてロールバック等はできませんが、これを可能にする方法はありますでしょうか?



現時点では、標準の機能にはありません。

実装での工夫で逃げるしかないでしょう。
・データベースにバイナリを書き込んで、それからファイルを作る
・書き込み失敗時に備えてファイルをコピーしておく
・別の名前で書き込む
などです。

このへんのことは、
赤間信幸氏著
.NETエンタープライズWebアプリケーション開発技術大全Vol.5
トランザクション設計編
に少し説明されています。


自力でそれっぽいものを作ることは可能ですが、あまりにも大変なのでやめておくことをお勧めします。

どれくらい大変かというと、データベースシステムを1こ作るほど未満、に近いくらいでしょうか。
需要があっても実現されていないのは、あらゆる状況に対応するのが厄介だからです。
Windowsの場合はファイルシステムの進歩待ちなんじゃないかと思います。
Windows以外でできるかというと、そういう機能はいまのところ聞いたことはありません。
ある、という情報をお持ちの方がいらっしゃいましたら、教えていただけるとうれしいです。

やるとなると、ACIDを異なるリソース間で実現しなければなりません。
コミット済みとされたものは書き込みに失敗しても復旧できるように、ロールフォワードの実装が必要になります。



無理にでもやるなら、以下の方法でできる可能性があります。
これらはトランザクションのための窓口を用意しているだけのものであって、ファイルのACIDを実現するのは自力で作ることになります。

・.NET Framework1.1では、COM+モジュールを自作
ただし、とても大変な作業ですし、COM+を使うと、インストールや管理にも手間をかけさせてしまいます。

・.NET Framework2.0では、リソースマネージャの実装
http://msdn2.microsoft.com/ja-jp/library/ms229975.aspx

私はデータベースの2PCしかやったことはありませんので定かな情報ではないことをご勘弁ください。

_________________
たつごろー
codeseek
こみゅぷらす

スキルアップ/キャリアアップ(JOB@IT)