<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Transactions on Brian Faust</title><link>https://wimdy.works/tags/transactions/</link><description>Recent content in Transactions on Brian Faust</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Mon, 01 Jan 0001 00:00:00 +0000</lastBuildDate><atom:link href="https://wimdy.works/tags/transactions/rss.xml" rel="self" type="application/rss+xml"/><item><title>Framework Convenience Has a Boundary</title><link>https://wimdy.works/thoughts/framework-convenience-has-a-boundary/</link><pubDate>Wed, 01 Jul 2020 00:00:00 +0000</pubDate><guid>https://wimdy.works/thoughts/framework-convenience-has-a-boundary/</guid><description>&lt;p&gt;A model was saved inside a database transaction. Its observer dispatched a
queue job. The worker started quickly, looked for the record which described
its work, and found nothing.&lt;/p&gt;
&lt;p&gt;The record existed in the transaction which dispatched the job, but it was not
yet visible to the worker&amp;rsquo;s database connection. Retained history connects that
race to successful wallet payments without a corresponding wallet transaction.
The job had been published; the state it needed had not. The framework did
exactly what the code asked. The shortcut failed because its lifecycle was
smaller than the business operation.&lt;/p&gt;</description></item><item><title>A Transaction Defines What Must Succeed Together</title><link>https://wimdy.works/thoughts/a-transaction-defines-what-must-succeed-together/</link><pubDate>Wed, 01 Feb 2017 00:00:00 +0000</pubDate><guid>https://wimdy.works/thoughts/a-transaction-defines-what-must-succeed-together/</guid><description>&lt;p&gt;A booking flow reserved funds, completed the remote booking, and captured the
funds. Only then did synchronous response processing fail. The remote booking
existed, the funds were captured, and the caller received a failure.&lt;/p&gt;
&lt;p&gt;The capture was individually valid, and its own database transaction committed
cleanly. It was still too early. We had drawn the success boundary around
“remote booking returned” while the operation promised something larger: a
complete booking result which the caller could use.&lt;/p&gt;</description></item><item><title>Silencing an Error Does Not Protect the Customer</title><link>https://wimdy.works/thoughts/silencing-an-error-does-not-protect-the-customer/</link><pubDate>Wed, 01 Jun 2016 00:00:00 +0000</pubDate><guid>https://wimdy.works/thoughts/silencing-an-error-does-not-protect-the-customer/</guid><description>&lt;p&gt;One of our shipment-booking paths returned success after it had already failed.
The remote booking existed and so did a local shipment, but the shipment had no
label and no tracking number. From the customer&amp;rsquo;s point of view, the one thing
we had promised to do was not done.&lt;/p&gt;
&lt;p&gt;The failure happened while persisting the carrier response. A broad catch
swallowed the exception, reported nothing, and let the request continue. This
was meant to serve a reasonable operational goal: do not bother customers with
errors if we can avoid it. Instead, we gave them a broken shipment and called
it a success.&lt;/p&gt;</description></item></channel></rss>