[ 
http://issues.apache.org/jira/browse/GERONIMO-724?page=comments#action_12315277 
] 

Ivan Dubrov commented on GERONIMO-724:
--------------------------------------

Yes, now it seems to work OK.


> Nested transactions do not work correctly
> -----------------------------------------
>
>          Key: GERONIMO-724
>          URL: http://issues.apache.org/jira/browse/GERONIMO-724
>      Project: Geronimo
>         Type: Bug
>   Components: transaction manager
>     Versions: 1.0-M4
>  Environment: Geronimo snapshot built on the 2005/06/30
> Embedded Derby
>     Reporter: Ivan Dubrov
>     Priority: Critical

>
> I have the following code in my business logic EJB stateless bean:
> // Create User entity and Account entity
> UserLocal user = userHome.create(group, data);
> AccountLocal account = accountHome.create(user);
> This is the ejbCreate and ejbPostCreate for the Account EJB:
> public Long ejbCreate(UserLocal user) {
>     try {
>         Long id = new Long(IdGeneratorUtil.getHome().create().generateId());
>         setId(id);
>         return id;
>     } catch (Exception e) {
>         throw new EJBException(e);
>     }
> }
>       
> public void ejbPostCreate(UserLocal user) {
>     setUser(user); // Set reference to the User entity
> }
> This is the snippet from the DDL, note that account references the USERS 
> table:
> CREATE TABLE ACCOUNTS (
>       ACCOUNT_ID BIGINT NOT NULL PRIMARY KEY,
>       USER_ID BIGINT REFERENCES USERS(USER_ID),
>        ...
> );
> The IdGenerator is the standard EJB pattern for generating identifiers - 
> Entity with counter behind Session. I have the following trasnactions 
> attributes (TA):
> All entities (User and Account) have TA = "Mandatory".
> Business logic (that creates Users and Accounts) EJB has TA = "Required"
> IdGenerator EJB have TA = "RequiresNew", so the identifier is generated in 
> the nested transaction.
> This should work, since creation of both entities is done in single 
> transaction (that is suspended several times when identifier generation is 
> invoked). So, this transaction contains two database inserts - for User and 
> for Account. Since both rows should be commited at once, the reference in the 
> Account table is satisfied.
> But I get the exception (sometimes, sometimes it just works)). Here is the 
> snippet from it:
> Caused by: SQL Exception: INSERT on table 'ACCOUNTS' caused a violation of 
> foreign key constraint 'SQL050705051513661' for key (72).  The statement has 
> been rolled back.
>         at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Util.java)
>         at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java)
> It looks like the row into the ACCOUNTS table is inserted (and commited) not 
> in the same transaction as row inserted into the USERS table, and even before 
> the row inserted (and commited) into the USERS.
> If I change transaction attribute for the IdGenerator stateless bean from 
> RequiresNew to Required everything it alway works, so the problem seems like 
> due to the nested transactions (maybe, the Account creation is associated 
> with incorrect transaction)

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to