[Seasar-user:10428] Re: [S2Dao]VersionNoによる排他制御が2回目の更新以降、正しく行われない。

JUNDU [E-MAIL ADDRESS DELETED]
2007年 9月 10日 (月) 12:38:49 JST


JUNDUです。

 排他制御の処理では、Daoに引数として渡したEntityの値がデータベースと同期して
インクリメントされており、それを使えば問題ないように思えます。

 やりたいことが排他制御なのか、VersionNoをインクリメントしたいだけなのか分か
りませんでしたが、S2Daoで提供されている機能は排他制御のための機能です。そのた
め、渡したEntityのVersionNoとデータベース上の値が一致しないと更新できずエラー
になります。

 排他制御を正しく使うのであれば、渡したEntityを2回目以降で使うか、以下のよう
にEntityのVersionNoをDtoに書き戻す処理が必要だと思います。

public class HogeLogicImpl implements HogeLogic {
	public void update(HogeDto dto) {
		HogeTable entity = convertDtoToTableEntity(dto); 
		dao.update(entity);
		dto.setVersionNo(entity.getVersionNo());
	}


nobu wrote:
> 近藤(nobu)です。
> 
> VersionNoによる排他制御の機能を実装したのですが、同レコードに2回目の
> updateを行うと例外が発生しています。
> 
> ※私の中ではVersionNoの排他制御は、updateを行うたびにテーブルのversionno
> (またはアノテーションで指定されたVersionNoProperty項目)の数値がカウント
> アップしていくものという認識です。この時点で間違えていたら、御指摘願いま
> す。
> 
> テーブルのversionnoの値は、insert,update(1回目),update(2回目)で、次のよ
> うに変化していくと思っています。
> 
> insert          versionno  0
> update(1回目)   versionno  0 -> 1
> update(2回目)   versionno  1 -> 2    ※ここのupdateでエラー
> 
> 実際、update(1回目)を実行後、versionnoの値は1になっていました。
> ところが、2回目のupdate文の中身を見てみると、
> 
> UPDATE ・・・  versionno = 1 WHERE id = 2 AND versionno = 0
> 
> となっています。2回目なので、
> 
> UPDATE ・・・  versionno = 2 WHERE id = 2 AND versionno = 1
> 
> と、ならなければならないとおもうのですが、うまくいきません。
> Dtoの設定が悪いのでしょうか?以下ソースです。
> 
> 
> == ソース ===========================================================
> ■メイン処理
> public class HogeLogicImpl implements HogeLogic {
> 	
> 	private HogeTableDao dao;
> 	
> 	public HogeDao getHogeDao() {
> 		return dao;
> 	}
> 
> 	public void setHogeDao(HogeTableDao dao) {
> 		this.dao = dao;
> 	}
> 
> 	public void update(HogeDto dto) {
> 		dao.update(convertDtoToTableEntity(dto));
> 	}
> 
> 	private HogeTable convertDtoToTableEntity(HogeDto dto)
> 	{
> 		HogeTable ent = new HogeTable();
> 		
> 		ent.setId(dto.getId());
> 
>>>> 
> 		ent.setVersionno(dto.getVersionno());
> 		
> 		return ent;
> 	}
> }
> 
> 
> 
> ■Dao
> 
> package hoge.dao;
> 
> import org.seasar.dao.annotation.tiger.Arguments;
> import org.seasar.dao.annotation.tiger.S2Dao;
> 
> import hoge.entity.HogeTable;
> 
> @S2Dao(bean=HogeTable.class)
> public interface HogeTableDao {
> 
> 	public HogeTable[] selectAll();
> 
> 	@Arguments("ID")
> 	public HogeTable selectById(Long id);
> 
> 	public int insert(HogeTable hoge);
> 
> 	public int update(HogeTable hoge);
> 
> 	public int delete(HogeTable hoge);
> 
> }
> 
> 
> 
> ■Entity
> 
> package hoge.entity;
> 
> import java.util.Date;
> 
> import org.seasar.dao.annotation.tiger.Bean;
> import org.seasar.dao.annotation.tiger.Column;
> import org.seasar.dao.annotation.tiger.Id;
> import org.seasar.dao.annotation.tiger.IdType;
> 
> @Bean(table="HOGE_TABLE",versionNoProperty="versionno")
> public class HogeTable {
> 
> 	private Long id;
> 
>>>> 
> 	private int versionno;
> 
> 
> 
> 	
> 	@Id(value=IdType.SEQUENCE,sequenceName="SEQ$HOGE_TABLE")
> 	public Long getId() {
> 		return id;
> 	}
> 
> 	public void setId(Long id) {
> 		this.id = id;
> 	}
> 
>>>> 
> 	public int getVersionno() {
> 		return versionno;
> 	}
> 
> 	public void setVersionno(int versionno) {
> 		this.versionno = versionno;
> 	}
> }
> =====================================================================
> 
> ■環境
> J2SDK 1.5.0_11
> Oracle 10g
> s2-framework-2.4.10
> s2-tiger-2.4.10
> s2-extension-2.4.10
> s2-dao-1.0.41-SNAPSHOT
> s2-dao-tiger-1.0.41-SNAPSHOT
> 
> テーブル上のversionnoは、Number(6) で定義しています。
> 
> 
> 以上、何か御存じの方、アドバイスをお願い致します。
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> 
> https://ml.seasar.org/mailman/listinfo/seasar-user
> 
>  



Seasar-user メーリングリストの案内