<div dir="ltr"><div><br>According to the manual, <a href="http://docs.racket-lang.org/db/query-api.html#%28part._transactions%29">http://docs.racket-lang.org/db/query-api.html#%28part._transactions%29</a>,  section</div><div>3.5,  postgres transactions can be issued directly in SQL (so called 'unmanaged').   Here is a short code segment that fails doing unmanaged transactions (and nothing else).<br><br>My question here is whether this code is doing unmanaged transactions correctly, and they are not working as advertised, or if there is something left out like an explicit reset to the connection after it throws an exception.</div><div><br></div>For purposes of illustration, I run the following query here in the psql shell to show the the error message that it correctly issues:<div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div>=> insert into x_unique_counters values ('table_author','1');</div></div><div><div>ERROR:  duplicate key value violates unique constraint "x_unique_counters_pkey"</div></div><div><div>DETAIL:  Key (name)=(table_author) already exists.</div></div></blockquote><div><br></div><div>Now the racket program is ready for this kind of problem, here 'the-query' is the same query just shown above, but this time issued from this code</div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><br></div><div><div>       (begin</div></div><div><div>            (semaphore-wait (current-db-semaphore))</div></div><div><div>            (query-exec pgc  "begin")</div></div><div><div>            (begin0</div></div><div><div>             (with-handlers</div></div><div><div>               (</div></div><div><div>                 [(lambda (v) #t) ; this handler catches anything</div></div><div><div>                   (lambda (v)</div></div><div><div>                     (query-exec pgc "rollback")</div></div><div><div>                     (semaphore-post (current-db-semaphore))</div></div><div><div>                     (raise v)</div></div><div><div>                     )</div></div><div><div>                   ]</div></div><div><div>                 )</div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div>               (query-exec pgc the-query) ; this throws an exception</div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div>               )</div></div><div><div>              (db-exec "commit")</div></div><div><div>              (semaphore-post (current-db-semaphore))</div></div><div><div>            ))</div></div><div><div>        ]</div></div><div><div>      ))</div></div></blockquote><div><br></div><div>So when query-exec throws an exception, the handler grabs it.  Then the handler executes an SQL rollback to cancel the transaction.  All appears to be good, but then bang!  we get an exception in the handler while doing the rollback:</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div>>(db-exec* '("rollback"))</div></div><div><div>query-exec: current transaction is invalid</div></div></blockquote><div><br></div><div>All attempts to do any further queries on the connection fail with the same error.   It appears to be foo-bar and a new connection must be made before any further SQL can be issued against the database.</div><div><br></div><div>Hmm, what is going on here?  Unmanaged connections not working as advertised .. or some switch that must be flipped to tell the connection to work again?</div><div><br>-Thomas<br><br></div></div>