Database transaction handling


I have extensions or scripts where I’m updating several things such as
changing ticket status and multiple custom field values. In such cases
partial updates would be bad, so I’m wondering about wrapping such code
inside a database transaction, so that if there’s a problem somewhere in
the middle, I can get things back to where they were before my code
started. But this raises a couple of questions:

  • Are scrips implicitly wrapped inside database transactions, so that
    rolling back is handled automatically if a scrip fails? If so, is it
    enough to return 0 from Commit method or does the scrip have to fail in
    some other fashion? Or if not, can I safely explicitly use transactions
    inside the scrip code?

  • I found this somewhere in your extensions. Is this a recommended way
    of starting a transaction, so that it never - even accidentally - can
    interfere with pre-existing transactions?

    my $in_txn = RT->DatabaseHandle->TransactionDepth;
    RT->DatabaseHandle->BeginTransaction unless $in_txn;

    RT->DatabaseHandle->Commit unless $in_txn;