[seasar-dotnet:1033] Re: QuillTestCaseのトランザクションについて

k.moriwaki [E-MAIL ADDRESS DELETED]
2008年 10月 22日 (水) 11:18:19 JST


久保さん
お世話になります、森脇です。

ODP.NET 11gをインストールし、providerをODPに変えたところ
ロールバックされるようになりました。

もともとインストールされていたOracleClientが9iだったのですが、
バージョンが原因かもしれないと思い11gをインストールしました。
# 9i、10gと順番に試してみた方が良かったかもしれませんが…。

結果を纏めると以下の通りとなりました。
  1. 9iがインストールされた状態
      1-1 .NET Framework Data Provider for Oracle
            → ロールバックされなかった
      1-2 Oracle Data Provider for .NET
            → インストールしていないので試していない

  2. 11gがインストールされた状態
      2-1 .NET Framework Data Provider for Oracle
            → ロールバックされなかった
      2-2 Oracle Data Provider for .NET
            → ロールバックされた

前回のメールには書いていませんでしたが、MbUnitで起動ではなく
Webサービスで試してみた際は.NET Framework Data Provider for Oracle
を使用していても正常にロールバックされました。
なのでロールバックされない現象は
  a. .NET Framework Data Provider for Oracleを使用
  b. MbUnitで実行
の両方を満たした場合に発生していると思われます。


他に何か試してみた方が良い事などありますでしょうか?


2008/10/21 19:08 kubo <[E-MAIL ADDRESS DELETED]>:
> 久保(jflute)です。
>
>>> 試しにOracle純正のDataProviderを利用してみるのもいいかも
>>> しれません。
>> 本日はもう帰宅してしまいましたので明日試してみます。
> はい、よろしくです。
>
> 2008/10/21 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>> 久保さn
>> 森脇です、回答ありがとうございます。
>>
>>> 1.「SelectEntityのテストを実行後、Insertのテストを実行すると」
>>> でしょうか?それとも、
>>> 2.「同じテストメソッド内で、SelectEntity()してInsert()すると」
>>> でしょうか?
>> ご推測のとおり1です。
>>
>>> 試しにOracle純正のDataProviderを利用してみるのもいいかも
>>> しれません。
>> 本日はもう帰宅してしまいましたので明日試してみます。
>>
>>
>> # 個人的にはすごく単純なチョンボのような気がしないでもないですが、
>> # dbflute-nbasic-exampleとの違いがDBくらいしか無い(と思っている)
>> # ので何が原因なのかさっぱりな感じです。
>>
>> 2008/10/21 18:29 kubo <[E-MAIL ADDRESS DELETED]>:
>>> 久保(jflute)です。
>>>
>>> 森脇さん、こんばんは
>>>
>>> 詳しい人が多分夏休みでしばらくいないので
>>> 取り急ぎ回答します。
>>>
>>>> 動きで気になる点としては以下のような感じです。
>>>>    a.Insertを初回に実行するとロールバックされる
>>>>    b.SelectEntityを実行後にInsertが実行されるとロールバックしない
>>>
>>> 確認ですが「SelectEntityを実行後にInsertが実行されると」
>>> というのは、
>>>
>>> 1.「SelectEntityのテストを実行後、Insertのテストを実行すると」
>>>
>>> でしょうか?それとも、
>>>
>>> 2.「同じテストメソッド内で、SelectEntity()してInsert()すると」
>>>
>>> でしょうか?
>>> ソースコードから前者だと思われますが。。。
>>>
>>> ちなみに、dbflute-noracle-exampleというのも存在していて、
>>> そちらで上記の「1」と「2」を両方ともやってみましたが、
>>> 再現しませんでした。(別のツールでDBを検索して確認しました)
>>>
>>> 設定の違いは、ぱっと見た限りはDataProviderが
>>> MS提供のものかOracle純正のものかだけのように思えます。
>>> 試しにOracle純正のDataProviderを利用してみるのもいいかも
>>> しれません。
>>> (OracleClientのインストールとかちょっと環境整えるの
>>>  面倒かもしれませんが。。。)
>>>
>>> 2008/10/21 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>>>> 森脇と申します。
>>>>
>>>> DBFluteのサンプルソース(dbflute-nbasic-example)と同じような
>>>> Bhvのテストケースを作成し、MbUnitで実行したのですがトランザクションが
>>>> ロールバックされない現象が起きました。
>>>>
>>>> MbUnitのGUIに表示されているログは「ロールバックされました」と表示されているのですが、
>>>> 実際にはDBにInsertされており、二回目以降でPK重複エラーになってしまいます。
>>>> 動きで気になる点としては以下のような感じです。
>>>>    a.Insertを初回に実行するとロールバックされる
>>>>    b.SelectEntityを実行後にInsertが実行されるとロールバックしない
>>>> dbflute-nbasic-exampleに同梱されていたMbUnitを使用しており、
>>>> そちらのテストケースはすべて成功します。
>>>>
>>>> 以下に挙げる設定で何か不足している点などありますでしょうか?
>>>>
>>>>
>>>>
>>>> 環境
>>>> OS:Windows XP SP3
>>>> 言語:VB(.NET Framework2.0)
>>>> 開発環境:VisualStudio 2005
>>>> DB:Oracle 10.1.0.2.0
>>>> S2Container.NET,S2Dao.NET:1.3.12
>>>> DBFlute 0.8.1
>>>>
>>>>
>>>> ----- MbUnitのログ -----
>>>>    INFO  (Logger#Info():0) - [IQLL0003]Quill設定ファイル(ある=true,なし=false):True
>>>>    DEBUG (Logger#Log():0) - 論理的なコネクションを取得しました
>>>>    DEBUG (Logger#Log():0) - トランザクションを開始しました
>>>>    DEBUG (S2DaoMetaDataFactoryImpl#GetDaoMetaData():68) - ...Creating
>>>> daoMetaData for 'CodeMstDao'.
>>>>    DEBUG (S2DaoMetaDataExtension#GetSqlCommand():76) -
>>>> ...Initializing sqlCommand for Insert().
>>>>    DEBUG (XLog#Log():21) -
>>>> /========================================================================
>>>>    DEBUG (XLog#Log():21) -
>>>>           CodeMstBhv.Insert()
>>>>    DEBUG (XLog#Log():21) -
>>>>           ==================/
>>>>    DEBUG (QLog#Log():22) - INSERT INTO CODE_MST (NAME, CODE,
>>>> VERSION_NO) VALUES ('テスト', '999', 0)
>>>>    DEBUG (XLog#Log():21) - ===========/ [00m00s016ms - Result: 1]
>>>>    DEBUG (XLog#Log():21) -
>>>>    DEBUG (Logger#Log():0) - トランザクションをロールバックしました
>>>>    DEBUG (Logger#Log():0) - 論理的なコネクションを閉じました
>>>>
>>>>
>>>> ----- App.config -----
>>>>    <?xml version="1.0" encoding="utf-8" ?>
>>>>    <configuration>
>>>>
>>>>      <configSections>
>>>>        <section name="log4net"
>>>> type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
>>>>        <section name="quill"
>>>> type="Seasar.Quill.Xml.QuillSectionHandler, Seasar.Quill"/>
>>>>      </configSections>
>>>>
>>>>      <quill>
>>>>        <dataSources>
>>>>          <dataSource name="KankyoDB">
>>>>            <provider>Oracle</provider>
>>>>            <connectionString>"Data Source=hogedb;User
>>>> Id=hoge;Password=hoge;"</connectionString>
>>>>            <class>Seasar.Extension.Tx.Impl.TxDataSource</class>
>>>>          </dataSource>
>>>>        </dataSources>
>>>>        <assemblys>
>>>>          <assembly>System.Data.OracleClient, version=2.0.0.0,
>>>> Culture=neutral, PublicKeyToken=b77a5c561934e089</assembly>
>>>>        </assemblys>
>>>>      </quill>
>>>>
>>>>      <log4net>
>>>>        <appender name="DebugLogFileAppender"
>>>> type="log4net.Appender.RollingFileAppender">
>>>>          <file value="C:\tmp\log\dbflute-nbasic-example-debug.log"/>
>>>>          <appendToFile value="true"/>
>>>>          <rollingStyle value="Date"/>
>>>>          <datePattern value="yyyyMMdd"/>
>>>>          <layout type="log4net.Layout.PatternLayout">
>>>>            <conversionPattern value="%date [%t] %-5level
>>>> (%C{1}#%M():%L) - %m%n"/>
>>>>          </layout>
>>>>        </appender>
>>>>        <appender name="DebugConsoleAppender"
>>>> type="log4net.Appender.ConsoleAppender">
>>>>          <layout type="log4net.Layout.PatternLayout">
>>>>            <conversionPattern value="%-5level (%C{1}#%M():%L) - %m%n"/>
>>>>          </layout>
>>>>        </appender>
>>>>        <root>
>>>>          <level value="DEBUG" />
>>>>          <appender-ref ref="DebugConsoleAppender"/>
>>>>        </root>
>>>>      </log4net>
>>>>
>>>>    </configuration>
>>>>
>>>>
>>>> ----- App.config -----
>>>>    namespace App.DB.Example.DBFlute
>>>>    {
>>>>        [TestFixture]
>>>>        public class BehaviorTest : QuillTestCase
>>>>        {
>>>>            /// <summary>
>>>>            /// Log
>>>>            /// </summary>
>>>>            private static readonly log4net.ILog m_log =
>>>>
>>>> log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
>>>>
>>>>            /// <summary>
>>>>            /// BehaviorSelector
>>>>            /// </summary>
>>>>            protected BehaviorSelector m_Selector;
>>>>
>>>>            /// <summary>
>>>>            /// Setup
>>>>            /// </summary>
>>>>            [MbUnit.Framework.SetUp]
>>>>            public void Before()
>>>>            {
>>>>                log4net.Config.XmlConfigurator.Configure();
>>>>
>>>>                AccessContext context = new AccessContext();
>>>>                context.AccessTimestamp = DateTime.Now;
>>>>                context.AccessUser = "testUser";
>>>>                context.AccessProcess = "testProcess";
>>>>                AccessContext.SetAccessContextOnThread(context);
>>>>            }
>>>>
>>>>            /// <summary>
>>>>            /// TearDown
>>>>            /// </summary>
>>>>            [MbUnit.Framework.TearDown]
>>>>            public void After()
>>>>            {
>>>>                AccessContext.ClearAccessContextOnThread();
>>>>            }
>>>>
>>>>            /// <summary>
>>>>            /// selectEntity
>>>>            /// </summary>
>>>>            [Test, Quill(Tx.Rollback)]
>>>>            public void SelectEntity()
>>>>            {
>>>>                // ## Arrange ##
>>>>                CodeMstCB cb = new CodeMstCB();
>>>>                cb.Query().SetCode_Equal("01");
>>>>
>>>>                // ## Act ##
>>>>                CodeMstBhv bhv = m_Selector.Select<CodeMstBhv>();
>>>>                CodeMst code = bhv.SelectEntity(cb);
>>>>
>>>>                // ## Assert ##
>>>>                m_log.Debug(code.ToString());
>>>>                Assert.AreEqual("01", code.Code);
>>>>            }
>>>>
>>>>            /// <summary>
>>>>            /// Insert
>>>>            /// </summary>
>>>>            [Test, Quill(Tx.Rollback)]
>>>>            public void Insert()
>>>>            {
>>>>                // ## Arrange ##
>>>>                CodeMst code = new CodeMst();
>>>>                code.Code = "999";
>>>>                code.Name = "テスト";
>>>>
>>>>                // ## Act ##
>>>>                CodeMstBhv bhv = m_Selector.Select<CodeMstBhv>();
>>>>                bhv.Insert(code);
>>>>            }
>>>>
>>>>        }
>>>>    }
>>>> _______________________________________________
>>>> seasar-dotnet mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


seasar-dotnet メーリングリストの案内