Thanks for the extra consideration Robert.

Since I'm implementing a generic driver, users can send either
single-statement transactions or actual multiple-statement transaction.
However, whether we're in a transaction or not doesn't seem to affect
Npgsql logic (unless I'm missing something) - if the cancellation does hit
a query the transaction will be cancelled and it's up to the user to roll
it back as is required in PostgreSQL...


On Thu, Jun 11, 2015 at 9:50 PM, Robert Haas <robertmh...@gmail.com> wrote:

> On Tue, Jun 9, 2015 at 4:42 AM, Shay Rojansky <r...@roji.org> wrote:
> > Ah, OK - I wasn't aware that cancellation was actually delivered as a
> > regular POSIX signal... You're right about the lack of guarantees then.
> >
> > In that case, I'm guessing not much could be do to guarantee sane
> > cancellation behavior... I do understand the "best effort" idea around
> > cancellations. However, it seems different to say "we'll try our best and
> > the cancellation may not be delivered" (no bad consequences except maybe
> > performance), and to say "we'll try our best but the cancellation may be
> > delivered randomly to any query you send from the moment you send the
> > cancellation". The second makes it very difficult to design a 100% sane,
> > deterministic application... Any plans to address this in protocol 4?
> >
> > Would you have any further recommendations or guidelines to make the
> > situation as sane as possible? I guess I could block any new SQL queries
> > while a cancellation on that connection is still outstanding (meaning
> that
> > the cancellation connection hasn't yet been closed). As you mentioned
> this
> > wouldn't be a 100% solution since it would only cover signal sending, but
> > better than nothing?
>
> Blocking new queries seems like a good idea.  Note that the entire
> transaction (whether single-statement or multi-statement) will be
> aborted, or at least the currently-active subtransaction, not just the
> current query.  If you're using single-statement transactions I guess
> there is not much practical difference, but if you are using
> multi-statement transactions the application kind of needs to be aware
> of this, since it needs to know that any work it did got rolled back,
> and everything's going to fail up until the current (sub)transaction
> is rolled back.
>
> --
> Robert Haas
> EnterpriseDB: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>

Reply via email to