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

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

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

Re[7]: トランザクションについて


(過去ログ 172 を表示中)

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

■98997 / inTopicNo.1)  トランザクションについて
  
□投稿者/ 初心者エンジニア (1回)-(2022/01/26(Wed) 23:37:40)

分類:[.NET 全般] 

トランザクション処理について質問させて頂きます。
例外をスローするとロールバックする意図として下記プログラムを組みました。
しかし例外をスローしてcatch構文を通るも処理Aがロールバックされず困っています。
なにか解決策はありますでしょうか。

環境
Asp.net WebForm(.net FrameWork4.7)
DB:Mysql

using(Enity entity = new Entity) {
using(var trn = entity.database.BeginTransaction) {
try{
処理A
      entity.テーブルA.Add(レコード内容)
entity.saveChanges();

///エラー発生

処理B(Aのレコード情報を使う処理)
      entity.テーブルB.Add(レコード内容)
entity.saveChanges();
trn.Commit();
}catch
 trn.RollBack();
{
}
}
}
引用返信 編集キー/
■98999 / inTopicNo.2)  Re[1]: トランザクションについて
□投稿者/ WebSurfer (2416回)-(2022/01/27(Thu) 07:31:19)
No98997 (初心者エンジニア さん) に返信

> しかし例外をスローしてcatch構文を通るも処理Aがロールバックされず困っています。

何を見てそう判断しているのですか?

Linq to Entities でエンティティを追加したり取得したりする場合、
デフォルトではエンティティは DbContext にキャッシュされます。

以前、ロールバックは期待通り動いていたがキャッシュのために動いて
ないと勘違いしたということがありましたが・・・
引用返信 編集キー/
■99000 / inTopicNo.3)  Re[2]: トランザクションについて
□投稿者/ 初心者エンジニア (3回)-(2022/01/27(Thu) 08:39:05)
No98999 (WebSurfer さん) に返信
> ■No98997 (初心者エンジニア さん) に返信
>
>>しかし例外をスローしてcatch構文を通るも処理Aがロールバックされず困っています。
>
> 何を見てそう判断しているのですか?
>
> Linq to Entities でエンティティを追加したり取得したりする場合、
> デフォルトではエンティティは DbContext にキャッシュされます。
>
> 以前、ロールバックは期待通り動いていたがキャッシュのために動いて
> ないと勘違いしたということがありましたが・・・

教えて頂きありがとうございます。
http://surferonwww.info/BlogEngine/post/2021/09/19/be-careful-about-cache-on-operation-of-linq-to-entities.aspx
上記を今拝見しましたが、DbContextにキャッシュされると言う意味が理解できませんでした。

ロールバックがされていないと判断したのは、
処理AのレコードがMysqlに登録されていたからです。
引用返信 編集キー/
■99001 / inTopicNo.4)  Re[3]: トランザクションについて
□投稿者/ WebSurfer (2417回)-(2022/01/27(Thu) 09:37:07)
No99000 (初心者エンジニア さん) に返信

> 上記を今拝見しましたが、DbContextにキャッシュされると言う意味が理解できませんでした。

質問者さんのコードの

> using(Enity entity = new Entity) {

は名前が変ですが、その entity はエンティティではなくコンテキストと理解してますが、その
理解が正しければ、

> entity.テーブルA.Add(レコード内容)

で Add したエンティティがコンテクストクラスにキャッシュ(保持)されるということを言っ
てます。

ロールバックしても、そのキャッシュはなくなりませんので、それを見てロールバックされてな
いと判断したのではなかろうかと思った次第です。


> ロールバックがされていないと判断したのは、
> 処理AのレコードがMysqlに登録されていたからです。

そうだとすると、コードの「///エラー発生」のところで catch に飛ばず、trn.Commit(); に進んで
コミットされたとしか思えませんが?
引用返信 編集キー/
■99002 / inTopicNo.5)  Re[4]: トランザクションについて
□投稿者/ 初心者エンジニア (4回)-(2022/01/27(Thu) 10:02:47)
No99001 (WebSurfer さん) に返信
> ■No99000 (初心者エンジニア さん) に返信
>
>>上記を今拝見しましたが、DbContextにキャッシュされると言う意味が理解できませんでした。
>
> 質問者さんのコードの
>
>>using(Enity entity = new Entity) {
>
> は名前が変ですが、その entity はエンティティではなくコンテキストと理解してますが、その
> 理解が正しければ、
>
>>entity.テーブルA.Add(レコード内容)
>
> で Add したエンティティがコンテクストクラスにキャッシュ(保持)されるということを言っ
> てます。
>
> ロールバックしても、そのキャッシュはなくなりませんので、それを見てロールバックされてな
> いと判断したのではなかろうかと思った次第です。

理解出来ました。ありがとうございます。
つまりロールバックされてもコンテキストに保持されるので、表示させて場合データベースになくても
キャッシュから表示できてしまうという事ですね。

>>ロールバックがされていないと判断したのは、
>>処理AのレコードがMysqlに登録されていたからです。
>
> そうだとすると、コードの「///エラー発生」のところで catch に飛ばず、trn.Commit(); に進んで
> コミットされたとしか思えませんが??
デバックで確認したのですが、コミットは通過していない&ロールバックは通過していました。
トランザクションを張っていてもオートコミットなどが実施されたりするものなのでしょうか?
引用返信 編集キー/
■99003 / inTopicNo.6)  Re[5]: トランザクションについて
□投稿者/ WebSurfer (2418回)-(2022/01/27(Thu) 10:17:30)
No99002 (初心者エンジニア さん) に返信

> デバックで確認したのですが、コミットは通過していない&ロールバックは通過していました。
> トランザクションを張っていてもオートコミットなどが実施されたりするものなのでしょうか?

MySQL 用のプロバイダが特別なのですかね? 何を使ってますか?
引用返信 編集キー/
■99006 / inTopicNo.7)  Re[5]: トランザクションについて
□投稿者/ WebSurfer (2419回)-(2022/01/27(Thu) 12:56:53)
No99002 (初心者エンジニア さん) に返信

> トランザクションを張っていてもオートコミットなどが実施されたりするものなのでしょうか?

> トランザクションを張っていてもオートコミットなどが実施されたりするものなのでしょうか?

自分の PC にインストールしてある Oracle 製の MySql.Data v8.0.19, MySql,Data.EntityFramework
v8.0.19 を使って試してみましたが、そういうことはなかったです。当たり前ですが。

ちなみに、以下の記事に書いてあるように自分の PC には MySQL 8.0.19 と Connector/NET 8.0.19
がインストールしてあって、その時に MySql.Data と MySql.Data.EntityFramework は自動的に GAC
にインストールされるのでそれを使いました。

MySQL をインストールしました(その 3)
http://surferonwww.info/BlogEngine/post/2020/04/20/installation-of-mysql-on-new-desktop-pc.aspx

上記以外のプロバイダや、Oracle 製でもバージョンの不整合があるとどうなるかは分かりませんが。
引用返信 編集キー/
■99008 / inTopicNo.8)  Re[6]: トランザクションについて
□投稿者/ 初心者エンジニア (6回)-(2022/01/27(Thu) 20:21:15)
No99006 (WebSurfer さん) に返信
> ■No99002 (初心者エンジニア さん) に返信
>
>>トランザクションを張っていてもオートコミットなどが実施されたりするものなのでしょうか?
>
>>トランザクションを張っていてもオートコミットなどが実施されたりするものなのでしょうか?
>
> 自分の PC にインストールしてある Oracle 製の MySql.Data v8.0.19, MySql,Data.EntityFramework
> v8.0.19 を使って試してみましたが、そういうことはなかったです。当たり前ですが。
>
> ちなみに、以下の記事に書いてあるように自分の PC には MySQL 8.0.19 と Connector/NET 8.0.19
> がインストールしてあって、その時に MySql.Data と MySql.Data.EntityFramework は自動的に GAC
> にインストールされるのでそれを使いました。
>
> MySQL をインストールしました(その 3)
> http://surferonwww.info/BlogEngine/post/2020/04/20/installation-of-mysql-on-new-desktop-pc.aspx
>
> 上記以外のプロバイダや、Oracle 製でもバージョンの不整合があるとどうなるかは分かりませんが。

詳しく丁寧にありがとうございます!!
調べたところテーブルのストレージエンジンがMyISAMでした。トランザクションをサポートしていませんでした。
解決済み
引用返信 編集キー/
■99010 / inTopicNo.9)  Re[7]: トランザクションについて
□投稿者/ WebSurfer (2420回)-(2022/01/28(Fri) 09:50:34)
No99008 (初心者エンジニア さん) に返信

> 調べたところテーブルのストレージエンジンがMyISAMでした。トランザクションをサポートしていませんでした。

そういうことは質問する前に調べましょう。最初の質問に MySQL と書いてあるから、普通に Oracle 製
の MySQL だと誰しも思いますよ。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -