在我的应用程序中,我们使用 TX Manager。 我的应用程序基于 JSF 和 RF3.3 构建,通过 JDBC 连接到 MYSQL 这是场景:-
- 用户在 GUI 上输入值。
- 收集完 Backing Bean 中的所有数据后,我得到了 Transaction Manager 的实例。
- 然后我开始发送。
- 所有值都插入到 DB1 中。
- 进行 SOAP 调用以将值插入到另一个 DB2 中。
- 如果 DB2 中的插入失败,DB1 中的条目应该回滚。 7.为此,我使用 tx.rollBack()。
问题是尽管 tx.rollBack 已执行,但条目并未删除。 我尝试声明 afterRollBackAction 并在 DB1 中触发删除查询,但它给了我一个异常
org.jboss.util.NestedSQLException: Transaction TransactionImple < ac, BasicAction: a7c198d:6:4eccc549:a status: ActionStatus.ABORTED > cannot proceed STATUS_ROLLEDBACK; - nested throwable: (javax.transaction.RollbackException: Transaction TransactionImple < ac, BasicAction: a7c198d:6:4eccc549:a status: ActionStatus.ABORTED > cannot proceed STATUS_ROLLEDBACK)
我正确检查了我的代码..没有异常(NPE或SQL或抛出任何其他类型的异常)..
您能告诉我为什么 TX 没有回滚并从 DB1 中删除条目吗?
代码片段:-
try
{
txManager.begin()
cStmt.setString(1,Name);
cStmt.setString(2,Address);
cStmt.setString(3,Number);
cStmt.registerOutParameter(10, java.sql.Types.INTEGER);
cStmt.execute();
int errorCode=cStmt.getShort(10);
if(errorCode==0)
{
WebService Stub =new WebServiceStub();
CreateIdentity create=new CreateIdentity();
create.setName(Name);
create.setAddress(Address);
create.setNumber(Number);
CreateIdentityResponse createResponse=stub.createIdentity(create);
int errorCodeFromWebService=createResponse.getMsg();
switch(errorCodeFromWebService)
{
case 0:
errorCode=0;
txmanager.commit();
break;
case -1:
txManager.rollback();
break;
default:
txManager.rollback();
}
else
{
txManager.rollback();
}
return errorCode;
尽管 txManager.rollback 被调用,但回滚本身并未发生。我尝试在回滚之前和之后使用操作,但没有成功。
最佳答案
正如 @Mark Rotteveel 指出的,如果您的表使用 MyIsam 引擎,事务将不起作用。如果您使用 InnoDB 引擎,请检查 jdbc 连接/jdbc 驱动程序的 autocommit 属性,应将其设置为 false。
关于java - 事务管理器未回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8240642/