Topic: 令人困惑的Transaction问题

  Print this page

1.令人困惑的Transaction问题 Copy to clipboard
Posted by: xjimmy
Posted on: 2003-01-15 11:51

本人试图用一个session bean封装两个entity bean,在session bean里面添加了一个method1,在method1中先后调用了两个entity bean的create方法,其中第二个create方法在执行中发生错误。
本人在deploy descriptor中使用JBuilder的缺省设置,即session bean和entity bean的每个方法都要求事务处理(Required)。
因此,虽然method1因第二个create方法在执行中发生错误而回滚,但第一个create方法却已经提交。
而我的希望当然是当method1回滚时,两个create方法都回滚。应该怎么设置呢?
谢谢!!

2.Re:令人困惑的Transaction问题 [Re: xjimmy] Copy to clipboard
Posted by: yuanandyy
Posted on: 2003-01-15 23:11

是呀,我也遇到过。有时可以回滚,有时又不行。希望那位大仙能够帮忙。

3.Re:令人困惑的Transaction问题 [Re: xjimmy] Copy to clipboard
Posted by: freeman99
Posted on: 2003-01-18 21:51

你需要把与entity bean使用的datasource改变成TxDataSource,这是在weblogic上的做法,其他平台我不了解具体做法。

4.Re:令人困惑的Transaction问题 [Re: xjimmy] Copy to clipboard
Posted by: nOMOre
Posted on: 2003-01-20 13:30


http://www.cjsdn.com/post/view?bid=2&id=10195&sty=1&tpg=1&age=0

5.把session的代码贴出来看看 [Re: xjimmy] Copy to clipboard
Posted by: nick
Posted on: 2003-01-23 12:15

把session的代码贴出来看看

6.Re:令人困惑的Transaction问题 [Re: xjimmy] Copy to clipboard
Posted by: xjimmy
Posted on: 2003-01-23 13:36

hi, nick
代码如下:
public String addNewBug(BugView bug) throws Exception {
/**@todo Complete this method*/
try {
if (bugsHome == null)
bugsHome = getBugsHome();

// if (devman == null)
// devman = getDataSource();
Connection dbConn = SqlBean.getConn();
java.util.Date d = new java.util.Date();
java.text.SimpleDateFormat formattor = new java.text.SimpleDateFormat("yyyyMMdd");
String sqlstr = "select max(ID) as MaxId from Bugs where ID like '" + formattor.formatFood.toString() + "%'";
ResultSet rs = SqlBean.getResultSet(dbConn, sqlstr);
String bugId;
if (rs.next()) {
bugId = rs.getString("MaxId");
if (bugId == null)
bugId = formattor.formatFood.toString() + "0001";
else
bugId = "" + ((new Long(bugId)).longValue() + 1);
}
else
bugId = formattor.formatFood.toString() + "0001";

bug.setId(bugId);
Bugs bugs = bugsHome.create(bug);

if (repeatStepHome == null)
repeatStepHome = getRepeatStepsHome();
for (java.util.Enumeration e=bug.getSteps().elements(); e.hasMoreElements(); ) {
RepeatStepView step = (RepeatStepView)e.nextElement();
step.setBugId(bugId);
repeatStepHome.create(step);
}

return bugs.getId();
}
catch (Exception e) {
e.printStackTrace();
throw e;
}
}

调用repeatStepHome.create(step)时出错,但整个方法未能回滚。事务属性设置为 * 和 Required。

7.Re:令人困惑的Transaction问题 [Re: xjimmy] Copy to clipboard
Posted by: nOMOre
Posted on: 2003-01-23 16:02

transaction主要分为四种类型:support,support not,require,require new
其中四种的意思以下一一作解释:
1,support-有就参与,没有就不参与;就以上例来说,一个sessionbean method(姑且叫做sMethod)种会调用两个不同entity bean方法(emethod1,emethod2),我们不去管sMethod怎样,若eMethod1,eMethod2的transaction设置成support,在它调用时候就去看sMethod是否在一个transaction中,若是则参与,若没有,则不参与;
2,not support-如1,有也不参与,没有也不参与;
3,require-需要一transaction;若某method设置成require(default),在被调用时候就去看它是否在一个transaction里面;有则参与进去,没有则new一个transaction;如上例:default方法都是require的,在你客户端(jsp,swing)调用sMethod时候就会new一个(require),eMethod1,2就参与进这个transaction中;
4,require new-无论有没有都去new一个;这个比较容易理解就不罗嗦了

8.Re:令人困惑的Transaction问题 [Re: xjimmy] Copy to clipboard
Posted by: whisperwind
Posted on: 2003-01-28 11:01

如果是cmt那么跟你的代码是无关的,建议你看看container中的datasource设置,看看是不是支持事务的datasource


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923