Samuel -
Please tell us more about how your multi-threaded application manages the PB Transaction object(s).
Does each thread create/connect/destroy its own Transaction object, or is it using/reusing SQLCA?
If it's using SQLCA, please be aware that each thread uses it own, local copy of global objects (like SQLCA). Syntactically, there is no problem doing this, but threads work with global objects a little differently than what you are probably used to.
Threads cannot share a database connection, nor can they access the global objects in use by either the main (GUI) thread or by any other thread. PB gives each thread a copy of global objects and variables as if the application has just initialized and started execution. This is done for thread safety. Therefore, the SQLCA your app uses in the main/GUI thread is NOT the same SQLCA used in alternate execution threads.
I've written an article in the PowerBuilder section about multi-threading in PB that explains this (and other aspects of multi-threaded PB applications) you may find helpful:
https://community.appeon.com/index.php/articles-blogs/tutorials-articles/2-powerbuilder/339-free-my-gui-multi-threading-in-powerbuilder
There is also an accompanying sample application in CodeXchange that shows one possible technique for retrieving data from a database with multi-threading.
https://community.appeon.com/index.php/codeexchange/powerbuilder/307-a-multi-threaded-data-retrieval-example
Best regards, John