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

kubo [E-MAIL ADDRESS DELETED]
2008年 10月 21日 (火) 18:29:45 JST


久保(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 メーリングリストの案内