C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: SqlServerのストアドについて


(過去ログ 37 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■19120 / inTopicNo.1)  SqlServerのストアドについて
  
□投稿者/ 小春 (13回)-(2008/05/20(Tue) 13:31:45)

分類:[データベース全般] 

2008/05/20(Tue) 14:10:09 編集(投稿者)

お世話になっております。

SqlServer2005ExpressEditionのストアドプロシージャを作成しております。
このストアドは、.Netアプリケーションから呼び出されるものとし、
.Netアプリケーション側でトランザクションを開始しています。

そこで、ストアドプロシージャ内で、.Net側のトランザクションとは別の
トランザクションを発生させ、単独でコミットをかけたい処理があるのですが、
いろいろ調べても分かりませんでした。

不可能なのでしょうか?
それとも、ストアドプロシージャを分け、.Net側での呼び出しを別に
変更した方が手っ取り早いのでしょうか?

宜しくお願い致します。
引用返信 編集キー/
■19122 / inTopicNo.2)  Re[1]: SqlServerのストアドについて
□投稿者/ ネタ好き (300回)-(2008/05/20(Tue) 13:48:02)
No19120 (小春 さん) に返信
ひとまず、Transact-SQLのストアドなのか、.NETプログラミングを使用したストアドなのか書いておいた方が良いと思います。
それと、トランザクションを分けると言う事は、それが不可分な一つの処理なのか、
それとも別々の処理なのかをはっきりさせた方が良いと思います。
引用返信 編集キー/
■19125 / inTopicNo.3)  Re[1]: SqlServerのストアドについて
□投稿者/ やじゅ (384回)-(2008/05/20(Tue) 14:02:07)
No19120 (小春 さん) に返信
> そこで、ストアドプロシージャ内で、.Net側のトランザクションとは別の
> トランザクションを発生させ、単独でコミットをかけたい処理があるのですが、
> いろいろ調べても分かりませんでした。
>

「SqlServer 自律型トランザクション」で検索しました。
Oracleにはあるんですが、SqlServerではまだ未実装のようです。
引用返信 編集キー/
■19126 / inTopicNo.4)  Re[2]: SqlServerのストアドについて
□投稿者/ 小春 (14回)-(2008/05/20(Tue) 14:06:22)
返信ありがとうございます。

No19122 (ネタ好き さん) に返信
> ■No19120 (小春 さん) に返信
> ひとまず、Transact-SQLのストアドなのか、.NETプログラミングを使用したストアドなのか書いておいた方が良いと思います。
CLRではなく、T-SQLのストアドです。

> それと、トランザクションを分けると言う事は、それが不可分な一つの処理なのか、
> それとも別々の処理なのかをはっきりさせた方が良いと思います。
別々の処理で、ストアドを分けることは可能ですが、
1本のストアドに記載されているので、なんとかこのままいきたいというか、
調べる内に実現できるのか、気になってしょうがないので投稿させて頂きました。


<現状>
CREATE PROCEDURE Hoge
AS
BEGIN
INSERT INTO Hoge1 … ←.Net側(CLRではない)のトランザクションで

INSERT INTO Hoge2 … ←.Net側(CLRではない)のトランザクションで
END

<理想>
CREATE PROCEDURE Hoge
AS
BEGIN
INSERT INTO Hoge1 … ←.Net側(CLRではない)のトランザクションで

INSERT INTO Hoge2 … ←ストアド内の別トランで
END

どうぞ宜しくお願い致します。
引用返信 編集キー/
■19128 / inTopicNo.5)  Re[2]: SqlServerのストアドについて
□投稿者/ 小春 (15回)-(2008/05/20(Tue) 14:11:58)
No19125 (やじゅ さん) に返信
> ■No19120 (小春 さん) に返信
>>そこで、ストアドプロシージャ内で、.Net側のトランザクションとは別の
>>トランザクションを発生させ、単独でコミットをかけたい処理があるのですが、
>>いろいろ調べても分かりませんでした。
>>
>
> 「SqlServer 自律型トランザクション」で検索しました。
> Oracleにはあるんですが、SqlServerではまだ未実装のようです。

返信ありがとうございます。
そうなんですか…。残念です。
上記キーワードで、もうちょっと調べてみます。
引用返信 編集キー/
■19129 / inTopicNo.6)  Re[3]: SqlServerのストアドについて
□投稿者/ ネタ好き (301回)-(2008/05/20(Tue) 14:12:13)
No19126 (小春 さん) に返信
明示的にトランザクションを開始するには、BEGIN TRANSACTION命令を使用します。
そしてコミットする場合にはCOMMIT TRANSACTION命令、
ロールバック時にはROLLBACK TRANSACTION命令を使用します。
此処で気をつけなればならないのは【データの一貫性】です。
例えば、 INSERT INTO Hoge1だけが成功して、 INSERT INTO Hoge2が失敗した場合、
データの整合性がおかしくなる事が危惧されます。
その辺は大丈夫でしょうか?
引用返信 編集キー/
■19135 / inTopicNo.7)  Re[4]: SqlServerのストアドについて
□投稿者/ 小春 (16回)-(2008/05/20(Tue) 14:23:11)
No19129 (ネタ好き さん) に返信
> ■No19126 (小春 さん) に返信
> 明示的にトランザクションを開始するには、BEGIN TRANSACTION命令を使用します。
> そしてコミットする場合にはCOMMIT TRANSACTION命令、
> ロールバック時にはROLLBACK TRANSACTION命令を使用します。
> 此処で気をつけなればならないのは【データの一貫性】です。
> 例えば、 INSERT INTO Hoge1だけが成功して、 INSERT INTO Hoge2が失敗した場合、
> データの整合性がおかしくなる事が危惧されます。
> その辺は大丈夫でしょうか?

返信ありがとうございます。
Hoge1は、大事なデータ で、
Hoge2は、ログ的なデータ なので、
整合性が合わなくても大丈夫です。

BEGIN TRANSACTION〜COMMIT TRANSACTIONを使用しては見ましたが、
.Net側のトランザクションに左右されているというか、単独でCOMMITされませんでした。
設定とかあるんでしょうか?

引用返信 編集キー/
■19136 / inTopicNo.8)  Re[3]: SqlServerのストアドについて
□投稿者/ はつね (717回)-(2008/05/20(Tue) 14:23:27)
はつね さんの Web サイト
No19126 (小春 さん) に返信
>>ひとまず、Transact-SQLのストアドなのか、.NETプログラミングを使用したストアドなのか書いておいた方が良いと思います。
> CLRではなく、T-SQLのストアドです。

CLRではなく「SQL CLR」ですね。


> CREATE PROCEDURE Hoge
> AS
> BEGIN
>     INSERT INTO Hoge1 …    ←.Net側(CLRではない)のトランザクションで
> 
>     INSERT INTO Hoge2 …    ←ストアド内の別トランで
> END

未確認ですが、次のような感じでもダメですか?

CREATE PROCEDURE Hoge
AS
BEGIN
    INSERT INTO Hoge1 …    ←.Net側(CLRではない)のトランザクションで

    BEGIN TRANSACTION
    INSERT INTO Hoge2 …    ←ストアド内の別トランで
    COMMIT TRANSACTION
END

でも、もし上手く意図どおりに動いたとしても、ストアド内の別トランザクションで
エラー発生したときのRollbackをどうするかとかちゃんと設計で考慮する必要があり
ます。




引用返信 編集キー/
■19138 / inTopicNo.9)  Re[4]: SqlServerのストアドについて
□投稿者/ 小春 (17回)-(2008/05/20(Tue) 14:29:07)
返信ありがとうございます。


No19136 (はつね さん) に返信
> ■No19126 (小春 さん) に返信
> >>ひとまず、Transact-SQLのストアドなのか、.NETプログラミングを使用したストアドなのか書いておいた方が良いと思います。
>>CLRではなく、T-SQLのストアドです。
>
> CLRではなく「SQL CLR」ですね。
すいません。CLRというと共通言語の方を指してしまうのですね。
今後略さず、SQL CLRと呼ぼうと思います。(未だ、組んだことはありませんが・・・。)
勉強になりました。

>
>>CREATE PROCEDURE Hoge
>>AS
>>BEGIN
>> INSERT INTO Hoge1 … ←.Net側(CLRではない)のトランザクションで
>>
>> INSERT INTO Hoge2 … ←ストアド内の別トランで
>>END
>
> 未確認ですが、次のような感じでもダメですか?
>
> CREATE PROCEDURE Hoge
> AS
> BEGIN
> INSERT INTO Hoge1 … ←.Net側(CLRではない)のトランザクションで
>
> BEGIN TRANSACTION
> INSERT INTO Hoge2 … ←ストアド内の別トランで
> COMMIT TRANSACTION
> END
>
> でも、もし上手く意図どおりに動いたとしても、ストアド内の別トランザクションで
> エラー発生したときのRollbackをどうするかとかちゃんと設計で考慮する必要があり
> ます。

試しましたが、COMMIT TRANSACTIONでコミットされませんでした。
呼び出し元の.Netアプリ側のトランザクションが優先?されました。
う〜

引用返信 編集キー/
■19140 / inTopicNo.10)  Re[5]: SqlServerのストアドについて
□投稿者/ ネタ好き (304回)-(2008/05/20(Tue) 14:33:47)
No19138 (小春 さん) に返信
恐らく.NETの挙動ではなくてSQL Serverの暗黙のコミットの仕業だと思います。
2005の場合はちょっと分からないのですが、確か2000ではそうでした。
これを解決するには、同じコネクションオブジェクトを使用して、
BEGIN TRANSACTIONをSqlCommandオブジェクトを使用して発行します。
そのようにしてトランザクションを操れば2000では出来ました。
引用返信 編集キー/
■19144 / inTopicNo.11)  Re[6]: SqlServerのストアドについて
□投稿者/ 小春 (19回)-(2008/05/20(Tue) 14:46:11)
No19140 (ネタ好き さん) に返信
> ■No19138 (小春 さん) に返信
> 恐らく.NETの挙動ではなくてSQL Serverの暗黙のコミットの仕業だと思います。
> 2005の場合はちょっと分からないのですが、確か2000ではそうでした。
> これを解決するには、同じコネクションオブジェクトを使用して、
> BEGIN TRANSACTIONをSqlCommandオブジェクトを使用して発行します。
> そのようにしてトランザクションを操れば2000では出来ました。

返信ありがとうございます。
やはり、.Net側でSqlCommandオブジェクトを別で使用しないといけないのでしょうか…。

引用返信 編集キー/
■19148 / inTopicNo.12)  Re[7]: SqlServerのストアドについて
□投稿者/ ネタ好き (305回)-(2008/05/20(Tue) 15:32:18)
No19144 (小春 さん) に返信
やらないとトランザクションが設定されないので不可避だと思います。
引用返信 編集キー/
■19150 / inTopicNo.13)  Re[8]: SqlServerのストアドについて
□投稿者/ やじゅ (385回)-(2008/05/20(Tue) 15:40:47)
> ■No19144 (小春 さん) に返信

「SqlServer トランザクション 入れ子」で検索しました。
SQL Serverは、入れ子の内側のトランザクションのコミットが無視されます。
内側のトランザクションは、最も外側にあるトランザクションの最後に
行われた操作に基づいてコミットされます。

ストアド内でトランザクションを入れても、コミットが無視されます。
引用返信 編集キー/
■19151 / inTopicNo.14)  Re[9]: SqlServerのストアドについて
□投稿者/ ネタ好き (306回)-(2008/05/20(Tue) 15:46:01)
>SQL Serverは、入れ子の内側のトランザクションのコミットが無視されます。

しまった!その規則忘れていました。
やっぱり処理を分けた方がいいみたいですね。
引用返信 編集キー/
■19177 / inTopicNo.15)  Re[10]: SqlServerのストアドについて
□投稿者/ 小春 (20回)-(2008/05/20(Tue) 19:26:42)
ご返信ありがとうございます。

No19150 (やじゅ さん) に返信
>>■No19144 (小春 さん) に返信
>
> 「SqlServer トランザクション 入れ子」で検索しました。
> SQL Serverは、入れ子の内側のトランザクションのコミットが無視されます。
> 内側のトランザクションは、最も外側にあるトランザクションの最後に
> 行われた操作に基づいてコミットされます。
>
> ストアド内でトランザクションを入れても、コミットが無視されます。
入れ子というキーワードは思いつきませんでした。
そういった規則があるのですね。
キーワードについても勉強になりました。

No19151 (ネタ好き さん) に返信
> >SQL Serverは、入れ子の内側のトランザクションのコミットが無視されます。
>
> しまった!その規則忘れていました。
> やっぱり処理を分けた方がいいみたいですね。
はい。納得しました。処理を分けるように致します。


回答してくださった方々、ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -