某一数据可以对应多个entitybean实例,那么当一entitybean的属性被改变后,其他entitybean能立即被同步吗?

04-05-27 difficult
我一直对entitybean的同步机制不理解

windeye
2004-05-27 11:22
要结合方法的事物属性

difficult
2004-05-27 11:24
to windeye :
你能说详细一点吗?


windeye
2004-05-27 11:31
用个最烂的例子:银行转帐.

实体bean: Account(代表帐号), Session Facade: AccountMgr

在AccountMgr的转帐方法中,将2个Account的balance属性进行增加和减少,
当该方法没有提交前,这些变化的属性很有可能不能同步,这要看该方法的
Transcation设置

difficult
2004-05-27 13:28
再我看来entitybean能保证并发性,保持与数据库同步根本就不是这么回事.

banq
2004-05-27 14:55
>entitybean的同步机制
应该说entitybean的映射mapping机制,CMP 实体Bean类似O/R mapping机制。

一数据可以对应多个entitybean,当外界对其中一个实体Bean数据实现修改后,根据具体容器不同实现方法,保证当其它实体Bean被使用时,其内容是最新的修改后的数据。

difficult
2004-05-27 17:36
总算等到banq老大的回复了.

>>一数据可以对应多个entitybean,当外界对其中一个实体Bean数据实现修改后,根据具体容器不同实现方法,保证当其它实体Bean被使用时,其内容是最新的修改后的数据。

我觉得你这话只说对了一半吧.
我的业务是这样的,类似于银行转帐业务:

有一帐户entitybean,里面包括帐号 userId和余额 account属性,由 e1 表示,在sessionbean中有两个方法f1(),f2() 由s1表示
f1()的业务逻辑为
f1(){
e1=e1home.findbyprimakey(userId);
e1.setAcount(newValue);
}

f2(int m){
e1=e1home.findbyprimakey(userId); //1
e1.getAccount(); //2
doOhterthing(); //其他操作 //3
if(el.getAccount()>m){ //4
e1.setAccount(account-m); //5
}
}

s1,e1都是容器管理事务.

原account的值为2000;
现在web层调用如
s1.f2(1000);
在f2()执行中,当执行完2步骤时,另一个客户端调用s1.f1(),使e1中account的值变为500;此时当f2中执行完三步到四步时,e1.getAccount()得到的值还是为2000,而不为500,因此就执行5步,这与业务逻辑显然不符。问题出在entitybean的account变为500时,f2中的entitybean的account却还没有同步。
我也试过当f2中没有事务时,4步e1.getaccount()可以得到500。但f2()必须有事务呀。

我想问banq前辈,是我理解错误,还是entitybean不支持,像这种业务,用ejb如何处理了?

windeye
2004-05-27 20:47
看看你事务的隔离级别设置的是什么。。。

banq
2004-05-28 09:29
你需要设置实体Bean CAID(原子性、、)事务属性。同时你的数据库要支持CAID。
同时,你的容器的数据源JNDI属性要激活支持XA等事务机制。

difficult
2004-05-28 10:15


我的数据库是sqlserver且已经打了支持分布式的补丁,数据源也支持XA事务机制。application server为weblogic 8.1.实体Bean的事物属性为容器管理如下:
<container-transaction>
<method>
<ejb-name>E1</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>

就是不知道如何设置实体Bean 的CAID属性?

difficult
2004-05-30 13:18
自己顶一把

廉价劳力
2004-05-30 13:27
f2()中不应该看到f1()的500,这个就是事务所要达到的隔离性的目的阿,最后f2()提交时应该失败,因为在f2()过程中f1()改了数据。客户端应重新调用f2(),这样就会基于f1()的数据500了。没有理解事务的概念,学点事务的原理再来做程序吧?


另外不需要XA,因为只有一个数据库。

廉价劳力
2004-05-30 13:37
哎,忘了最重要的一点了,f1(), F2()都要设成Required属性. 如果没设这个,f1(), f2()都非原子操作,会互相干扰.

difficult
2004-05-31 21:12
to 廉价劳力 :
>>f2()中不应该看到f1()的500,这个就是事务所要达到的隔离性的目的阿,最后f2()提交时应该失败。
如果最后f2()提交时失败也行,但实际上最后f2()提交并没有失败。也就是entitybean并没有提供解决这种并发问题的机制。我不知的还需要设置什么,我此处f1(), F2()都已设成Required属性,在weblgoic8.1上试验。

difficult
2004-06-02 10:01
我顶

猜你喜欢
2Go 1 2 下一页