2011-11-23 2 views
1

내 응용 프로그램에서 TX Manager를 사용하고 있습니다. 내 응용 프로그램이 MYSQL 에 JDBC 연결과 JSF와 RF3.3을 기반으로 다음 시나리오입니다 : -트랜잭션 관리자가 ROLLBACK되지 않음

  1. 사용자가 GUI에 값을 입력합니다.
  2. Backing Bean의 모든 데이터를 수집 한 후 트랜잭션 관리자의 인스턴스를 얻습니다.
  3. 그럼 나는 TX를 시작한다.
  4. 모든 값이 DB1에 삽입됩니다.
  5. 다른 DB2에 값을 삽입하도록 SOAP 호출이 작성됩니다.
  6. DB2 삽입에 실패 할 경우 DB1에서 항목을 롤백해야합니다. 7.이 경우 tx.rollBack()을 사용합니다.

문제가 있지만 tx.rollBack이 실행 되더라도 항목이 제거되지 않습니다. 나는 afterRollBackAction를 선언 시도하고 DB1에서 삭제 쿼리를 해고 그러나 그것은 나에게 예외 내가 properly..There 예외없는 내 코드를 확인

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에서 항목을 삭제하지 않는지 말해 줄 수 있습니까?

코드 조각 : - txManager.rollback 호출하지만, 그 자체가 발생하지 않는 롤백됩니다 있지만

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; 

. 롤백 전후의 작업을 시도했지만 아무 소용이 없습니다.

+0

테이블이 InnoDB입니까? 그들이 MyISAM 인 경우, 트랜잭션 제어하에 있지 않으므로 롤백 할 수 없습니다. –

답변

0

마찬가지로 @Mark Rotteveel은 테이블이 MyIsam 엔진 트랜잭션을 사용하는 경우 작동하지 않는다고 지적했습니다. InnoDB 엔진을 사용하고있는 경우, jdbc connection/jdbc 드라이버의 autocommit 프로퍼티를 확인해, false로 설정할 필요가 있습니다.

+0

잘 autocommit 속성은 false입니다. 이미 확인했습니다. – AngelsandDemons

+0

다른 옵션은 스토어드 프로 시저를 호출하기 때문에 스토어드 프로 시저가 SQL 코드 내에 커밋으로 종료된다는 것입니다. – Giovanni

+1

절대적으로 자리 잡았습니다. 저장 프로 시저의 일을 결코 깨닫지 못했습니다 .... 고맙습니다 ... – AngelsandDemons

0

일부 코드는 도움이 될 것입니다 ... 나는 트랜잭션 롤백이 끝날 때 실행 중이므로 오류가 있다고 생각합니다.

+0

롤백하기 전에 롤백을 시도했는데 두 가지 방법 모두 동일한 예외가 발생했습니다 .... – AngelsandDemons

관련 문제