2011-11-23 136 views
1

在我的应用程序中,我们使用的是TX管理器。 我的应用程序是建立在JSF和RF3.3与JDBC连接到MySQL 这里的情景: - 在GUI事务管理器没有得到ROLLBACKed

  1. 用户输入值。
  2. 收集Backing Bean中的所有数据后,我得到事务管理器的实例。
  3. 然后我开始TX。
  4. 所有的值都插入到DB1中。
  5. SOAP调用是为了在另一个DB2中插入值。
  6. 如果在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)

我检查了我的代码properly..There也不例外(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被调用,但回滚本身没有发生。我试着在回滚之前和之后使用动作,但无济于事。

+0

您的表InnoDB?如果它们是MyISAM,那么它们不受事务控制,不能回滚。 –

回答

0

由于@Mark Rotteveel指出,如果您的表使用MyIsam引擎事务不起作用。如果您使用的是InnoDB引擎,请检查您的jdbc连接/ jdbc驱动程序的autocommit属性,它应该设置为false。

+0

那么autocommit属性是false ..我已经检查过它。 – AngelsandDemons

+0

另一个选项,因为你正在调用一个存储过程,存储过程以其SQL代码中的提交结束。 – Giovanni

+1

绝对地点...我从来没有意识到存储过程的事情....非常感谢... – AngelsandDemons

0

一些代码会帮助...我认为这个错误是因为你在事务回滚结束时运行它,但我不太确定这一点。

+0

我在回滚之前和回滚之后尝试过。两种方式都给出相同的异常.... – AngelsandDemons