[seasar-dotnet:732] メソッド単位のトランザクション指定について
Mitsuo Nakamura
[E-MAIL ADDRESS DELETED]
2008年 1月 10日 (木) 11:55:17 JST
はじめまして。いつもお世話になっております。
中村と申します。
S2DAO.NET+S2AOP.NETを利用しようとしております。
DBのトランザクション管理を、S2Container.NETのAOPで行おうと試しておりま
すが、想定する動きとなりません。今やりたいことは、メソッド単位(ここでは、
TxClient.Execメソッド)にトランザクションをかける事です。
現状では、以下のような結果となってしまい、メソッド全体にトランザクションを
かけられていません。(コネクション切断と同時にコミットされています。)正しく
aspectできていない事が原因のようですが、理由がわかりませんでした。
【実行結果】
DEBUG [10:44:12] 論理的なコネクションを取得しました
DEBUG [10:44:12] 論理的なコネクションを閉じました
DEBUG [10:44:12] 論理的なコネクションを取得しました
DEBUG [10:44:12] INSERT INTO Sample (ID, DATA) VALUES ('1', 'ああああ')
DEBUG [10:44:12] 論理的なコネクションを閉じました
DEBUG [10:44:17] 論理的なコネクションを取得しました
DEBUG [10:44:17] DELETE FROM Sample WHERE ID = '1'
DEBUG [10:44:17] 論理的なコネクションを閉じました
INFO [10:44:17] 完了です
以下にソースを添付いたしますので、お手数をおかけいたしますが、ご指摘のほど、
よろしくお願いいたします。
なお、環境は、以下の通りです。
OS :Windows Vista Business(32bit)
開発環境:VB .Net2005
検証DB :InterBase BDP
SqlServer NativeClient
S2.NET :1.3.5
以下、dicon・ソースファイルです。
----------------------------------------------------------------------------
---------------------
[Dao.dicon]
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components>
<!-- Tx.dicon -->
<include path="S2DaoSample/Ado.dicon" />
<!-- S2Dao.NETのDaoInterceptorとそれに必要なコンポーネント -->
<component
class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
<component
class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
<component
class="Seasar.Extension.ADO.Impl.DatabaseMetaDataImpl" />
<component
class="Seasar.Dao.Impl.FieldAnnotationReaderFactory" />
<component class="Seasar.Dao.Impl.DaoMetaDataFactoryImpl" />
<component
class="Seasar.Extension.Component.Impl.ComponentInvoker" />
<component name="TransactionStateHandler"
class="Seasar.Extension.Tx.Impl.TransactionStateHandler" />
<component name="DaoInterceptor"
class="Seasar.Dao.Interceptors.S2DaoInterceptor" />
<component name="RequiredTx"
class="Seasar.Extension.Tx.TransactionInterceptor">
<arg>
<component
class="Seasar.Extension.Tx.Impl.RequiredTxHandler" />
</arg>
</component>
<!-- サンプルDao-->
<component name="IsampleDao"
class="S2DaoSample.Dao.IsampleDao">
<aspect>DaoInterceptor</aspect>
</component>
<!-- TxClientクラス -->
<component name="TxClient" class="S2DaoSample.TxClient">
<aspect pointcut="Exec">RequiredTx</aspect>
</component>
</components>
----------------------------------------------------------------------------
---------------------
[Program.vb]
Imports System.IO
Imports System.Reflection
Imports log4net
Imports log4net.Config
Imports log4net.Util
Imports Seasar.Framework.Container
Imports Seasar.Framework.Container.Factory
Module Program
Sub Main()
'log4netの初期化
InitApplication()
'アプリケーション構成ファイルに定義されたDiconファイルのパスを取得
Dim diconPath As String = SingletonS2ContainerFactory.ConfigPath
Dim container As IS2Container = S2ContainerFactory.Create(diconPath)
'S2Containerを初期化
container.Init()
'TxClientをDI
Dim client As Itx =
DirectCast(container.GetComponent(GetType(TxClient), "TxClient"), TxClient)
'実行
client.Exec()
End Sub
'初期化を行なうメソッド
Private Sub InitApplication()
'アプリケーション構成ファイル(<アプリケーション名>.exe.config)の取得
Dim info As New
FileInfo(SystemInfo.AssemblyShortName(Assembly.GetExecutingAssembly()) +
".exe.config")
'ログ出力ライブラリ「log4net」の初期化
XmlConfigurator.Configure(LogManager.GetRepository(), info)
End Sub
End Module
----------------------------------------------------------------------------
---------------------
[TxClient.vb]
Imports System
Imports System.IO
Imports System.Reflection
Imports log4net.Util
Imports log4net
Imports log4net.Config
Imports Seasar.Framework.Container
Imports Seasar.Framework.Container.Factory
Imports S2DaoSample.Entity 'Entityクラスの格納場所
Imports S2DaoSample.Dao 'Daoクラスの格納場所
Public Interface Itx
Sub Exec()
End Interface
Public Class TxClient : Implements Itx
'ロガーを取得
Private ReadOnly logger As log4net.ILog = _
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod()
.DeclaringType)
Private spDao As IsampleDao
Public WriteOnly Property IsampleDao() As IsampleDao
Set(ByVal value As IsampleDao)
spDao = value
End Set
End Property
Public Sub Exec() Implements Itx.Exec
Dim sample As New Sample
sample.id = 1
sample.data = "ああああ"
spDao.Insert(sample)
spDao.Delete(sample)
'結果を表示して停止
logger.Info("完了です")
Console.ReadLine()
End Sub
End Class
----------------------------------------------------------------------------
---------------------
[IsampleDao.vb]
Imports System
Imports Seasar.Dao.Attrs 'S2Dao.NETの属性を使用
Imports S2DaoSample.Entity 'Entityクラスの格納場所
Namespace Dao
' Bookテーブルにアクセスする為のDao
'対応するEntityを指定
<Bean(GetType(Sample))> _
Public Interface IsampleDao
'追加登録
Sub Insert(ByVal sample As Sample)
'削除
Sub Delete(ByVal sample As Sample)
End Interface
End Namespace
----------------------------------------------------------------------------
---------------------
以上です。
よろしくお願いいたします。
seasar-dotnet メーリングリストの案内