<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <base href="https://hibernate.atlassian.net" />
<title>Message Title</title>
</head>
<body class="jira" style="color: #333; font-family: Arial, sans-serif; font-size: 14px; line-height: 1.429">
<table id="background-table" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; background-color: #f5f5f5; border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<!-- header here -->
<tr>
<td id="header-pattern-container" style="padding: 0px; border-collapse: collapse; padding: 10px 20px">
<table id="header-pattern" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="header-avatar-image-container" valign="top" style="padding: 0px; border-collapse: collapse; vertical-align: top; width: 32px; padding-right: 8px"> <img id="header-avatar-image" class="image_fix" src="https://secure.gravatar.com/avatar/5fb22020cb431050dcec6c1d20fc77bd?d=mm&s=48" height="32" width="32" border="0" style="border-radius: 3px; vertical-align: top" />
</td>
<td id="header-text-container" valign="middle" style="padding: 0px; border-collapse: collapse; vertical-align: middle; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> <a class="user-hover" rel="bvarner" id="email_bvarner" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=bvarner" style="color:#6c797f;; color: #3b73af; text-decoration: none">Bryan Varner</a> <strong>created</strong> an issue
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td id="email-content-container" style="padding: 0px; border-collapse: collapse; padding: 0 20px">
<table id="email-content-table" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-spacing: 0; border-collapse: separate">
<tr>
<!-- there needs to be content in the cell for it to render in some clients -->
<td class="email-content-rounded-top mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 15px; background-color: #fff; border-left: 1px solid #ccc; border-top: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom: 0; border-top-right-radius: 5px; border-top-left-radius: 5px; height: 10px; line-height: 10px; padding: 0 15px 0 16px; mso-line-height-rule: exactly">
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 15px 16px; background-color: #fff">
<table id="page-title-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="page-title-pattern-first-line" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; padding-top: 16px"> <a href="https://hibernate.atlassian.net/browse/HHH" style="color: #3b73af; text-decoration: none">Hibernate ORM</a> / <a href="https://hibernate.atlassian.net/browse/HHH-8365" style="color: #3b73af; text-decoration: none"><img src="https://hibernate.atlassian.net/images/icons/issuetypes/bug.png" height="16" width="16" border="0" align="absmiddle" alt="Bug" /></a> <a href="https://hibernate.atlassian.net/browse/HHH-8365" style="color: #3b73af; text-decoration: none">HHH-8365</a>
</td>
</tr>
<tr>
<td style="vertical-align: top;; padding: 0px; border-collapse: collapse; padding-right: 5px; font-size: 20px; line-height: 30px; mso-line-height-rule: exactly" id="page-title-pattern-header-container"> <span id="page-title-pattern-header" style="font-family: Arial, sans-serif; padding: 0; font-size: 20px; line-height: 30px; mso-text-raise: 2px; mso-line-height-rule: exactly; vertical-align: middle"> <a href="https://hibernate.atlassian.net/browse/HHH-8365" style="color: #3b73af; text-decoration: none">JPA LockTimeoutException leaves transaction marked rollback with PostgreSQL</a> </span>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand wrapper-special-margin" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 15px 16px; background-color: #fff; padding-bottom: 5px">
<table class="keyvalue-table" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 0px">
Issue Type:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding-left: 5px; vertical-align: top"> <img src="https://hibernate.atlassian.net/images/icons/issuetypes/bug.png" height="16" width="16" border="0" align="absmiddle" alt="Bug" /> Bug
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 0px">
Affects Versions:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding-left: 5px; vertical-align: top">
4.1.10
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 0px">
Assignee:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding-left: 5px; vertical-align: top">
Unassigned
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 0px">
Components:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding-left: 5px; vertical-align: top">
entity-manager
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 0px">
Created:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding-left: 5px; vertical-align: top">
16/Jul/13 12:35 PM
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 0px">
Environment:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding-left: 5px; vertical-align: top">
Hibernate 4.1.x, PostgreSQL 9.1, (JBoss AS 7.1.x, EAP 6, Wildfly)
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 0px">
Labels:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding-left: 5px; vertical-align: top">
jpa2 postgresql locks
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 0px">
Priority:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding-left: 5px; vertical-align: top"> <img src="https://hibernate.atlassian.net/images/icons/priorities/major.png" height="16" width="16" border="0" align="absmiddle" alt="Major" /> Major
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 0px">
Reporter:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding-left: 5px; vertical-align: top"> <a class="user-hover" rel="bvarner" id="email_bvarner" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=bvarner" style="color:#6c797f;; color: #3b73af; text-decoration: none">Bryan Varner</a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand issue-description-container" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 15px 16px; background-color: #fff">
<table class="text-paragraph-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 2px">
<tr>
<td class="text-paragraph-pattern-container mobile-resize-text" style="padding: 0px; border-collapse: collapse; padding: 0px">
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">According to the <a href="http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#lock(java.lang.Object, javax.persistence.LockModeType, java.util.Map)" class="external-link" rel="nofollow" style="color: #3b73af; text-decoration: none">JPA 2.0 API</a>, invocations of lock() are only supposed to throw LockTimeoutException if only the lock <b>statement</b> is rolled back, rather than the entire <b>transaction</b>. (emphasis mine)</p>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">The PessimisticLockException is supposed to be thrown if the entire tx is rolled back.</p>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">The current implementation is working perfectly if you're not in a TX (See related issue, <a href="https://hibernate.atlassian.net/browse/HHH-7251" title="PostgreSQL Dialect not properly mapping SQL error codes for pessimistic lock exceptions." class="issue-link" data-issue-key="HHH-7251" style="color: #3b73af; text-decoration: none"></a></p>
<del>
HHH-7251
</del>), it's mapping the proper type, and since there's no TX context, it's accurately returning the proper exception type.
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">The desired behavior:</p>
<ul>
<li>
If in a TX and a query timeout is specified, return a LockTimeoutException and only rollback the lock() statement
</li>
</ul>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">Can be accomplished with PostgreSQL, but it takes multiple statements and the use of a Savepoint.</p>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">The code below demonstrates what doesn't work....</p>
<div class="code panel" style="border-width: 1px;; border: 1px solid #ccc; background: #f5f5f5; font-size: 12px; line-height: 1.333; font-family: monospace; border: 1px solid #ccc; -moz-border-radius: 3px 3px 3px 3px; border-radius: 3px 3px 3px 3px; margin: 9px 0">
<div class="codeContent panelContent" style="padding: 9px 12px">
<pre class="code-java" style="margin: 10px 0 0 0; max-height: 30em; overflow: auto; white-space: pre-wrap; word-wrap: normal">
Map<<span class="code-object" style="color: #910091">String</span>, <span class="code-object" style="color: #910091">Object</span>> params = <span class="code-keyword" style="color: #000091">new</span> HashMap<>();
params.put(<span class="code-quote" style="color: #009100">"javax.persistence.lock.timeout"</span>, 0);
List<Foo> foos = entityManager.createQuery(<span class="code-quote" style="color: #009100">"SELECT f FROM foo"</span>, Foo.class).getResultList();
Foo lockedFoo = <span class="code-keyword" style="color: #000091">null</span>;
<span class="code-keyword" style="color: #000091">for</span> (Foo foo : foos) {
<span class="code-keyword" style="color: #000091">try</span> {
entityManager.lock(foo, LockModeType.PESSIMISTIC_WRITE, params);
lockedFoo = foo;
<span class="code-keyword" style="color: #000091">break</span>;
} <span class="code-keyword" style="color: #000091">catch</span> (LockTimeoutException lte) {
<span class="code-comment" style="color: #808080">// This is what we want!
</span> } <span class="code-keyword" style="color: #000091">catch</span> (PessimisticLockException ple) {
<span class="code-comment" style="color: #808080">// This is what we'd get <span class="code-keyword" style="color: #000091; color: #808080">if</span> we didn't have a timeout set and we had an issue blocking <span class="code-keyword" style="color: #000091; color: #808080">for</span> the lock.
</span> <span class="code-keyword" style="color: #000091">break</span>;
} <span class="code-keyword" style="color: #000091">catch</span> (PersistenceException pe) {
<span class="code-keyword" style="color: #000091">break</span>;
}
}
<span class="code-keyword" style="color: #000091">if</span> (lockedFoo != <span class="code-keyword" style="color: #000091">null</span>) {
<span class="code-comment" style="color: #808080">// <span class="code-keyword" style="color: #000091; color: #808080">do</span> something with the locked foo.
</span>}
</pre>
</div>
</div>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">When iterating attempting to grab a lock on the second item in the list (if the first item cannot be locked) you end up with:</p>
<blockquote style="margin: 10px 0 0 0; border-left: 1px solid #ccc; color: #707070; margin-left: 19px; padding: 10px 20px">
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">ERROR: current transaction is aborted, commands ignored until end of transaction block</p>
</blockquote>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">You can dance around this some creative use of createNativeQuery() and manually tweaking save points. It seems like since this goes against what the JPA2 javadocs describe, it would be more appropriate for Hibernate to manage the creation of and rollback to (if necessary) the savepoint if a SELECT FOR UPDATE NOWAIT cannot lock.</p>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 15px 16px; background-color: #fff">
<table id="actions-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px">
<tr>
<td id="actions-pattern-container" valign="middle" style="padding: 0px; border-collapse: collapse; padding: 0 0 0 24px; vertical-align: middle; padding-left: 0px">
<table align="left" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td class="actions-pattern-action-icon-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0px; vertical-align: middle"> <a href="https://hibernate.atlassian.net/browse/HHH-8365#add-comment" target="_blank" title="{getText($action.text)}" style="color: #3b73af; text-decoration: none"> <img class="actions-pattern-action-icon-image" src="https://hibernate.atlassian.net/images/mail/comment-icon.png" alt="Add Comment" title="{Add Comment}-icon" height="16" width="16" border="0" style="vertical-align: middle" /> </a>
</td>
<td class="actions-pattern-action-text-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px"> <a href="https://hibernate.atlassian.net/browse/HHH-8365#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none">Add Comment</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- there needs to be content in the cell for it to render in some clients -->
<tr>
<td class="email-content-rounded-bottom mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 5px; line-height: 5px; background-color: #fff; border-top: 0; border-left: 1px solid #ccc; border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; mso-line-height-rule: exactly">
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td id="footer-pattern" style="padding: 0px; border-collapse: collapse; padding: 12px 20px">
<table id="footer-pattern-container" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="footer-pattern-text" class="mobile-resize-text" width="100%" style="padding: 0px; border-collapse: collapse; color: #999; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px">
This message is automatically generated by JIRA.<br /> If you think it was sent incorrectly, please contact your JIRA administrators<br /> For more information on JIRA, see: <a style="color:#6c797f;; color: #3b73af; text-decoration: none" href="http://www.atlassian.com/software/jira">http://www.atlassian.com/software/jira</a>
</td>
<td id="footer-pattern-logo-desktop-container" valign="top" style="padding: 0px; border-collapse: collapse; padding-left: 20px; vertical-align: top">
<table style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="footer-pattern-logo-desktop-padding" style="padding: 0px; border-collapse: collapse; padding-top: 3px"> <img id="footer-pattern-logo-desktop" src="https://hibernate.atlassian.net/images/mail/footer-desktop-logo.png" alt="JIRA logo" title="JIRA logo" width="92" height="36" class="image_fix" />
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>