Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

EJB3 transaction rollback

I'm using CMT in EJB3 state-less session beans. Also I've created my own Exception having the annotation "@ApplicationException (rollback=true)".

  1. Do I have to use "context.setRollbackOnly()" when I want to rollback the transaction?

  2. Can I just rollback the transaction by throwing an exception inside public method in the bean?

  3. If so (the answer to Q#2 is yes) do I have to throw the exception out of the method by declaring the exception in the method or will it be sufficient to just throw an exception inside the method and handle it inside the same method itself? (I don't want to propagate the exception to the next level. I just want to rollback the exception.)

Thanks in advance. ;)

like image 848
ruwan.jayaweera Avatar asked Mar 02 '10 03:03

ruwan.jayaweera


People also ask

How to rollback transaction in EJB?

First of all, there is no rollback of an exception, it's a rollback of a transaction. If you throw your exception with @ApplicationException(rollback=true) , you don't have to rollback the transaction manually. Context. setRollbackOnly() forces the container to rollback the transaction, also if there is no exception.

What is transactional rollback?

Rolls back an explicit or implicit transaction to the beginning of the transaction, or to a savepoint inside the transaction. You can use ROLLBACK TRANSACTION to erase all data modifications made from the start of the transaction or to a savepoint. It also frees resources held by the transaction.

How do I rollback a container managed EJB transaction?

There are two ways to roll back a container-managed transaction. First, if a system exception is thrown, the container will automatically roll back the transaction. Second, by invoking the setRollbackOnly method of the EJBContext interface, the bean method instructs the container to roll back the transaction.

How does EJB transaction work?

EJB Container/Servers are transaction servers and handles transactions context propagation and distributed transactions. Transactions can be managed by the container or by custom code handling in bean's code. Container Managed Transactions − In this type, the container manages the transaction states.


1 Answers

First of all, there is no rollback of an exception, it's a rollback of a transaction.

  1. If you throw your exception with @ApplicationException(rollback=true), you don't have to rollback the transaction manually. Context.setRollbackOnly() forces the container to rollback the transaction, also if there is no exception.
  2. A checked exception itself doesn't rollback a transaction. It needs to have the annotation @ApplicationException(rollback=true). If the exception is a RuntimeException and the exception isn't caught, it forces the container to rollback the transaction. But watch out, the container will in this case discard the EJB instance.
  3. As mentioned in 2.), if you throw a RuntimeException, the transaction will be rolled back automatically. If you catch an checked exception inside the code, you have to use setRollbackOnly to rollback the transaction.

For further information, check out the free book Mastering EJB. It describes the rollback scenarios very well and is free for download.

like image 196
Steve Avatar answered Oct 02 '22 09:10

Steve