[
https://issues.apache.org/jira/browse/OPENJPA-2196?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13404076#comment-13404076
]
Scott Parkerson commented on OPENJPA-2196:
------------------------------------------
Consider, also, this scenario, where OpenJPA is using PostgreSQL and the owner
of sequence is not the same user of the client (but client does have the
{{USAGE}} grant on the sequence to call nextval, etc.). Let i be the initial
starting value of the database sequence.
1. An OpenJPA application connects to the database, and inserts n records into
the database where n > 1 and n < allocationSize. On the first insert, the
{{ALTER SEQUENCE}} call is made fails silently (although PostgreSQL will log an
error serverside, but since the exception is swallowed by the client, no one is
the wiser -- including the code that "thinks" it has the next allocationSize
ids cached. The database, however, still thinks that next sequence number is
i+1.
2. If the application is stopped and restarted, the next insert will fail due
to a duplicate key violation (because, since the first ALTER SEQUENCE failed,
the database still thinks its current sequence is i+1, but OpenJPA allowed that
record to be inserted in the first run.
I'm not seeing the behavior where the ALTER SEQUENCE call marks the transaction
for rollback, though. I *think* I'm in a JTA-managed transaction, too... so not
sure about that. Looking at the code in NativeJDBCSeq.allocateInternal, it
appears that a new connection is grabbed from the store; not sure that
connection is under JTA.
At minimum, I think that OpenJPA should detect the failure to ALTER SEQUENCE
and not cache allocationSize values (perhaps logging to WARN level the first
time this happens per session per sequence). Additionally, the original
DBDictionary.commonCreateAlterSequenceSQL should always specify INCREMENT BY
even if it is set to 1, as that breaks the "workaround" for users who wish
emulate previous OpenJPA behavior using useNativeSequenceCache=False.
> Create Sequence Postgres 9.1
> ----------------------------
>
> Key: OPENJPA-2196
> URL: https://issues.apache.org/jira/browse/OPENJPA-2196
> Project: OpenJPA
> Issue Type: Bug
> Components: jdbc, jpa
> Affects Versions: 2.2.0
> Environment: OpenJPA-2.2.0
> Transaction-type JTA
> Postgres 9.1
> JBoss 6.1
> Reporter: Hendi Marcos Ramos Silva
> Assignee: Albert Lee
> Fix For: 2.2.1
>
> Original Estimate: 4h
> Remaining Estimate: 4h
>
> Sorry my bad english ..
> when annotated a entity with @SequenceGenerator and with allocationSize = 1
> and initialValue = 1, the method DBDictionary.commonCreateAlterSequenceSQL is
> creating a alter sequence sql invalid for Postgres 9.1.
> Despite the documentation of postgres inform you that the other parameters
> are optional
> (http://www.postgresql.org/docs/9.1/static/sql-altersequence.html), an error
> occurs in executing the sql below.
> Eg: ALTER SEQUENCE schema_experimento.usuario_sq (no other attributes)
> Even the method NativeJDBCSeq.udpateSql being fault tolerant, the connection
> is marked for rollback and not allowing run the next val of sequence.
> HĂȘndi Marcos
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira