[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
| 
Re: [eclipselink-users] How to disable auto-commit in EclipseLink
 | 
Answers inline.
On 12/16/2010 6:32 AM, patric@xxxxxxxxxxx wrote:
After tracing and looking through the source code I think that this
issue is even more crucial:
EclipseLink will only enable auto-commit after a rollback() or commit()
of a transaction:
Please have a look at DatabaseAccessor.java:
basicBeginTransaction() will disable auto-commit()
basicCommitTransaction() will enable auto-commit()
basicRollbackTransaction() will also enable auto-commit()
This means that the result in the database of some JPA operations may
differ if a tranaction has been rollbacked or committed before.
The result in the db in the same no matter what has happened before 
beginTransaction.
Why has it been implemented that way?
basicBegin/Commit/RollbackTransaction methods are used only in case 
connections are not managed.
Eclipselink acquires connection from connection pool assuming it has 
full control over it. It doesn't assume that connection may be in use 
and in the middle of transaction.
In the end of transaction auto-commit is set to true because some 
Eclipselink configurations support writing without transactions 
(DatabaseSession).
Is it an intentional behaviour?
Yes
Zitat von patric@xxxxxxxxxxx:
Hi,
I just saw that EclipseLink tries to enable the autocommit
functionality on the Connection object in some cases.
How can I disable that?
Because I am sharing the Connection which is used by EclipseLink with
some other transaction controller an auto-commit simply break the
transaction concept.
You can't do that. Instead tell Eclipselink that you use external 
transaction controller (in persistence.xml or pass to createEMF):
property "eclipselink.target-server" -> "MyTransactionController"
where:
class MyTransactionController extends 
org.eclipse.persistence.transaction.JTATransactionController {
  public MyTransactionController() {
    super();
    this.transactionManager = new MyTransactionManager();
  }
}
use it together with your data source, indicate that external 
transaction controller is used:
public class Customizer implements SessionCustomizer {
    public void customize(Session session) throws SQLException {
        CustomServerPlatform platform = new 
CustomServerPlatform(session); 
platform.setExternalTransactionControllerClass(JTATransactionController.class);
        session.setServerPlatform(platform);
        MyDataSource ds = new MyDataSource();
        ds.setURL(session.getLogin().getConnectionString());
        session.getLogin().setConnector(new JNDIConnector(ds));
        session.getLogin().useExternalConnectionPooling();
	session.getLogin().useExternalTransactionController();
    }
}
In you app. begin JTA transaction, obtain connection from the data 
source, do whatever jdbc you need to do,
then createEntityManager, join it to the transaction 
(em.joinTransaction()), do whatever jpa you need to do;
then commit JTA transaction.
If there's no such functionality - is it safe to intercept
EclipseLink's setAutoCommit(true) invocation by my Connection wrapper?
Thank you and best regards,
Patric
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users