- PR -

SpringのHibernateトランザクションについて

1
投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2004/01/26
投稿数: 27
投稿日時: 2005-08-31 19:49
現在webアプリを作成しています。
あるDBに対してデータを取得して編集して更新というシステムなんですが、
SpringのHibernateDaoSupportを使用してのトランザクション処理を使用しているのですが
どうもよくわかりません・・・。

設定は以下のようになっていまして
<!-- Hibernate Transaction Manager 設定 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>

<!-- Facade 設定 -->
<bean id="facadeTarget" class="test.ServiceImpl">
<property name="testiDao">
<ref bean="testDao"/>
</property>
</bean>

<!-- Hibernate Transaction Manager 詳細設定 -->
<bean id="facade" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="target">
<ref local="facadeTarget"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE</prop>
<prop key="save*">PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE</prop>
</props>
</property>
</bean>

1,test.ServiceImplのgetDataメソッド→testDaoのgetDataメソッドを呼び出し
2,1で取得したデータをjsfで編集
3,test.ServiceImplのsaveDataメソッド→testDaoのsaveDataメソッドを呼び出し
この1〜3をまとめてトランザクションしたいのですが、
1は1、3は3で分かれてトランザクションしているような感じです。

このようなトランザクションを実装したい場合どうすればいいのでしょうか?

よろしくお願いいたします
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2005-08-31 20:42
JSFで編集と言う事は、
 1,test.ServiceImplのgetDataメソッド→testDaoのgetDataメソッドを呼び出し

 3,test.ServiceImplのsaveDataメソッド→testDaoのsaveDataメソッドを呼び出し
の間にユーザの操作が介入すると言う事でしょうか?

そうだとすると、1と3を1つのトランザクションの下で動かすのは無理があると思います。

ユーザの操作が介入すると言う事は...
・ユーザの操作にどれだけ時間がかかるかわからない。何分もかかるかもしれない。
 →そんなに長い時間トランザクションをアクティブにしておくのは危険です。
  と言うか、トランザクションがタイムアウトしてしまうと思います。
・ユーザが操作せずにブラウザを閉じるかもしれない。
 →トランザクションが完了できないことになります。
未記入
常連さん
会議室デビュー日: 2004/01/26
投稿数: 27
投稿日時: 2005-08-31 21:36
引用:

YOU@ITさんの書き込み (2005-08-31 20:42) より:
JSFで編集と言う事は、
 1,test.ServiceImplのgetDataメソッド→testDaoのgetDataメソッドを呼び出し

 3,test.ServiceImplのsaveDataメソッド→testDaoのsaveDataメソッドを呼び出し
の間にユーザの操作が介入すると言う事でしょうか?

そうだとすると、1と3を1つのトランザクションの下で動かすのは無理があると思います。

ユーザの操作が介入すると言う事は...
・ユーザの操作にどれだけ時間がかかるかわからない。何分もかかるかもしれない。
 →そんなに長い時間トランザクションをアクティブにしておくのは危険です。
  と言うか、トランザクションがタイムアウトしてしまうと思います。
・ユーザが操作せずにブラウザを閉じるかもしれない。
 →トランザクションが完了できないことになります。




ご返信ありがとうございます。
そうです、1,と3,の間にユーザの操作が入ります。
なるほど、やはり難しいですか・・

ユーザAがデータを取得して、Aが変更中にユーザBもデータを取得した場合
ユーザAが先に登録してもユーザBが編集して更新を行えばユーザAの更新は
意味がなくなってしまうのでそれを何とかできればいいのですが。

前に楽観的ロックについて質問させてもらいましたが
DBの構成を変えなくては実現が難しいと返信をいただきましたが
DBの構成はほかのシステムにも反映してるので変えることができません。
なにかいい方法があればいいんですが・・
1

スキルアップ/キャリアアップ(JOB@IT)