<p>This seems like it would be the default behaviour, but because the exception that <a href="https://github.com/ruby/ruby/blob/v2_3_1/lib/timeout.rb#L106">Timeout::timeout raises on the other thread</a> <a href="https://gist.github.com/zerebubuth/8211e07e9f592e5b8146dea2344906b7">doesn't appear to be rescue-able</a>, <a href="https://github.com/rails/rails/blob/v4.2.7.1/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb#L185">Rails doesn't detect it</a>. However, it still runs the ensure block, which <a href="https://github.com/rails/rails/blob/v4.2.7.1/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb#L193-L198">attempts to commit</a> the transaction.</p>
<p>The result of this is that a long-running transaction can potentially be interrupted while partially complete and will commit the partial result rather than rolling back.</p>
<p>I've tried to fix this by using <code>Timeout.timeout</code>'s second argument, which allows a custom exception to be thrown. On the API side, we were doing this anyway, so hopefully the behaviour is unchanged. On the web side, I've added in some extra logic to treat the API error as if it were a <code>Timeout::Error</code>.</p>
<p>Thanks to <a href="https://github.com/Zverik" class="user-mention">@Zverik</a> for pointing this out.</p>

<hr>

<h4>You can view, comment on, or merge this pull request online at:</h4>
<p>  <a href='https://github.com/openstreetmap/openstreetmap-website/pull/1381'>https://github.com/openstreetmap/openstreetmap-website/pull/1381</a></p>

<h4>Commit Summary</h4>
<ul>
  <li>Make API and web roll back any open transactions on timeout.</li>
  <li>Try to cover all code paths.</li>
</ul>

<h4>File Changes</h4>
<ul>
  <li>
    <strong>M</strong>
    <a href="https://github.com/openstreetmap/openstreetmap-website/pull/1381/files#diff-0">app/controllers/application_controller.rb</a>
    (10)
  </li>
</ul>

<h4>Patch Links:</h4>
<ul>
  <li><a href='https://github.com/openstreetmap/openstreetmap-website/pull/1381.patch'>https://github.com/openstreetmap/openstreetmap-website/pull/1381.patch</a></li>
  <li><a href='https://github.com/openstreetmap/openstreetmap-website/pull/1381.diff'>https://github.com/openstreetmap/openstreetmap-website/pull/1381.diff</a></li>
</ul>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br />You are receiving this because you are subscribed to this thread.<br />Reply to this email directly, <a href="https://github.com/openstreetmap/openstreetmap-website/pull/1381">view it on GitHub</a>, or <a href="https://github.com/notifications/unsubscribe-auth/ABWnLeaj3QN6bV-tDcnm-rNRASusD422ks5rCsHrgaJpZM4K9s2S">mute the thread</a>.<img alt="" height="1" src="https://github.com/notifications/beacon/ABWnLRYz9EKPDup_5rEhHmE2oWO48BA6ks5rCsHrgaJpZM4K9s2S.gif" width="1" /></p>
<div itemscope itemtype="http://schema.org/EmailMessage">
<div itemprop="action" itemscope itemtype="http://schema.org/ViewAction">
  <link itemprop="url" href="https://github.com/openstreetmap/openstreetmap-website/pull/1381"></link>
  <meta itemprop="name" content="View Pull Request"></meta>
</div>
<meta itemprop="description" content="View this Pull Request on GitHub"></meta>
</div>

<script type="application/json" data-scope="inboxmarkup">{"api_version":"1.0","publisher":{"api_key":"05dde50f1d1a384dd78767c55493e4bb","name":"GitHub"},"entity":{"external_key":"github/openstreetmap/openstreetmap-website","title":"openstreetmap/openstreetmap-website","subtitle":"GitHub repository","main_image_url":"https://cloud.githubusercontent.com/assets/143418/17495839/a5054eac-5d88-11e6-95fc-7290892c7bb5.png","avatar_image_url":"https://cloud.githubusercontent.com/assets/143418/15842166/7c72db34-2c0b-11e6-9aed-b52498112777.png","action":{"name":"Open in GitHub","url":"https://github.com/openstreetmap/openstreetmap-website"}},"updates":{"snippets":[{"icon":"DESCRIPTION","message":"Api timeout rollbacks (#1381)"}],"action":{"name":"View Pull Request","url":"https://github.com/openstreetmap/openstreetmap-website/pull/1381"}}}</script>