Skip to content

Commit ee2099f

Browse files
committed
HHH-9945 - Allow Transaction to rollback if marked-for-rollback-only
1 parent f0f852f commit ee2099f

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

hibernate-core/src/main/java/org/hibernate/engine/transaction/internal/TransactionImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88

99
import javax.transaction.Synchronization;
1010

11-
import org.jboss.logging.Logger;
12-
1311
import org.hibernate.HibernateException;
1412
import org.hibernate.Transaction;
1513
import org.hibernate.TransactionException;
1614
import org.hibernate.internal.CoreLogging;
1715
import org.hibernate.resource.transaction.TransactionCoordinator;
1816
import org.hibernate.resource.transaction.spi.TransactionStatus;
1917

18+
import org.jboss.logging.Logger;
19+
2020
import static org.hibernate.resource.transaction.TransactionCoordinator.TransactionDriver;
2121

2222
/**
@@ -71,8 +71,8 @@ public void commit() {
7171
@Override
7272
public void rollback() {
7373
TransactionStatus status = transactionDriverControl.getStatus();
74-
if ( status != TransactionStatus.ACTIVE && status != TransactionStatus.FAILED_COMMIT ) {
75-
throw new TransactionException( "Transaction not successfully started" );
74+
if ( !status.canRollback() ) {
75+
throw new TransactionException( "Cannot rollback transaction in current status [" + status.name() + "]" );
7676
}
7777

7878
LOG.debug( "rolling back" );

hibernate-core/src/main/java/org/hibernate/resource/transaction/spi/TransactionStatus.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,26 @@ public enum TransactionStatus {
4646
* Status code indicating a transaction that is in the process of
4747
* rolling back.
4848
*/
49-
ROLLING_BACK
49+
ROLLING_BACK;
50+
51+
public boolean isOneOf(TransactionStatus... statuses) {
52+
for ( TransactionStatus status : statuses ) {
53+
if ( this == status ) {
54+
return true;
55+
}
56+
}
57+
return false;
58+
}
59+
60+
public boolean isNotOneOf(TransactionStatus... statuses) {
61+
return !isOneOf( statuses );
62+
}
63+
64+
public boolean canRollback() {
65+
return isOneOf(
66+
TransactionStatus.ACTIVE,
67+
TransactionStatus.FAILED_COMMIT,
68+
TransactionStatus.MARKED_ROLLBACK
69+
);
70+
}
5071
}

0 commit comments

Comments
 (0)