2011-11-23 135 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