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

k.moriwaki [E-MAIL ADDRESS DELETED]
2008年 10月 21日 (火) 17:50:23 JST


森脇と申します。

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