gpt4 book ai didi

java - 无状态 session EJB 3.0 中的事务回滚

转载 作者:行者123 更新时间:2023-12-02 00:46:30 24 4
gpt4 key购买 nike

我有一个符合 3.0 规范的无状态 session EJB。

/*Remote Interface*/

package com.nseit.ncfm2.data.ejb;
import java.sql.SQLException;
import java.util.Collection;

import javax.ejb.Remote;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.naming.NamingException;

import com.nseit.ncfm2.security.Audit;

@Remote
public interface ProductionDataChangesRequestsRemote {

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public boolean shiftCandidateDetails(String sourceNcfmId,
String destinationNcfmId, Collection<String> specialCasesList, String shiftingRemarks, String user, Audit updtAudit) throws NamingException, SQLException;
}


/*Bean Class*/

package com.nseit.ncfm2.data.ejb;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.naming.NamingException;

import com.nseit.ncfm2.security.Audit;
import com.nseit.ncfm2.util.server.lookup.LookUpServerResources;
import java.sql.*;
import java.util.*;

/**
* Session Bean implementation class ProductionDataChangesRequestsBean
*/
@Stateless(name = "ProductionDataChangesRequestsBean", mappedName = "ProductionDataChangesRequestsEJB")
@Remote(ProductionDataChangesRequestsRemote.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
public class ProductionDataChangesRequestsBean implements
ProductionDataChangesRequestsRemote {

/**
* Default constructor.
*/
public ProductionDataChangesRequestsBean() {
// TODO Auto-generated constructor stub
}

@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public boolean shiftCandidateDetails(String sourceNcfmId,
String destinationNcfmId, Collection<String> specialCasesList,
String shiftingRemarks, String user, Audit updtAudit)
throws NamingException, SQLException {
// TODO Auto-generated method stub
Connection conn = null;
PreparedStatement pstmt = null;

int updtCnt = 0;

boolean areDetailsShifted = false;

try {
..............
..............
..............

/* Start: update table-1 */
..............
..............
..............

updtCnt = pstmt.executeUpdate();
..............
..............
..............

/* End: update table-1 */


/* Start: update table-2 */
..............
..............
..............

updtCnt = pstmt.executeUpdate();
..............
..............
..............

/* End: update table-2 */

areDetailsShifted = true;

} /*catch (SQLException e) {
// TODO Auto-generated catch block
System.out
.println("SQLException in ProductionDataChangesRequestsBean.shiftCandidateDetails(...) "
+ e.getMessage());
// e.printStackTrace();

context.setRollbackOnly();

} */finally {
LookUpServerResources.closeStatement(pstmt);
LookUpServerResources.closeConnection(conn);
}

return areDetailsShifted;
}

}

目前,如果第一个表更新成功,而第二个表更新出现异常,则不会发生回滚,即更新第一个表中的记录。

我希望在发生 SQLException 时回滚事务(或者就此而言,如果发生任何运行时异常)。

我尝试了两种方法:

  1. 在 SQLException 的 catch block 中使用 context.setRollbackOnly()
  2. 抛出 SQLException

在这两种情况下,事务都没有回滚。

我怎样才能做到这一点:

  1. 不使用 @ApplicationException 注释(因为我没有任何应用程序异常)
  2. 没有捕获 SQLException 然后调用 context.setRollbackOnly()

或者标准方法是什么?

最佳答案

您必须抛出RuntimeException

关于java - 无状态 session EJB 3.0 中的事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4883572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com