]
Craig Ringer updated AS7-4552:
------------------------------
Attachment: JBossAS7H2Tests.zip
Two more test cases, demonstrating that the bug is reproducible with the H2 database too;
it's not just a PostgreSQL JDBC driver issue.
There are two tests within JBossAS7H2Tests.zip.
JBossAS7ContainerTransactionsWithH2ContainerDS uses a container-provided datasource to,
within a transactional EJB method, create a SAVEPOINT then ROLLBACK TO that savepoint. It
works as expected.
JBossAS7ContainerTransactionsWithH2DataSourceDefinition does exactly the same thing but
uses a datasource provided by @DataSourceDefinition instead of a container provided data
source. It fails to rollback to the savepoint, because the savepoint has ceased to exist
when the transaction (auto)committed after the `SAVEPOINT' statement ran. It
malfunctions in exactly the same way the PostgreSQL tests do.
If you rewrote the PostgreSQL tests to use `SAVEPOINT' and `ROLLBACK TO SAVEPOINT'
you'd get the same behavior from the PostgreSQL tests; the container-managed
datasource would work, but the @DataSourceDefinition one wouldn't.
JBoss AS 7 produces non-transactional (autocommit) EntityManager
within transactional EJB methods when using 3rd party javax.sql.DataSource via
@DataSourceDefinition
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key: AS7-4552
URL:
https://issues.jboss.org/browse/AS7-4552
Project: Application Server 7
Issue Type: Bug
Components: EJB, JPA / Hibernate, Transactions
Affects Versions: 7.1.1.Final
Environment: java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Linux ayaki.localdomain 3.3.0-4.fc16.x86_64 #1 SMP Tue Mar 20 18:05:40 UTC 2012 x86_64
x86_64 x86_64 GNU/Linux
Reporter: Craig Ringer
Assignee: jaikiran pai
Labels: autocommit, ejb, jdbc, jta, postgresql, transaction,
transaction_manager, xa
Attachments: JBossAS7ContainerTransactionsWith3rdPtyDataSource.zip,
JBossAS7ContainerTransactionsWith3rdPtyDataSourceFixed.zip,
JBossAS7ContainerTransactionsWithJBossDataSource.zip, JBossAS7H2Tests.zip
When using a javax.sql.DataSource via @DataSourceDefinition to create the JTA datasource
for a persistence unit, transactional EJB business methods run without transactions. No
warning or error is emitted.
Business method calls annotated @TransactionAttribute(TransactionAttributeType.REQUIRED)
receive an EntityManager that *is in autocommit mode*, ie is *not* in a transaction.
This violates the EJB3 spec and is a nasty problem.
I discovered this when testing some code that uses deferred constraints to create two
interdependent database objects; record A must have at least one record B referencing it,
but record B also has a foreign key reference to record A. This can be satisfied only with
deferred constraints, and works fine in SQL-level testing. When testing with Arquillian at
the JBoss AS 7 / Hibernate / JPA level, though, it was breaking.
Further investigation showed that the entity manager was in autocommit despite the method
being transactional, as demonstrated by a test that tries to create and fetch from a
cursor.
The attached self-contained test case demonstrates this issue. I'll be working on
testing the issue against H2 or Derby next, but wanted to get this report in here first.
Even if this proves to be an issue with PostgreSQL's javax.sql.DataSource
implementation, JBoss AS 7 clearly has some validation and checking to do because it
*must* not allow an autocommit entity manager to be injected for transactional business
methods.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: