Jira issue originally created by user @beberlei:
From the mailing list:
I'm using DBAL 2.1 with Oracle and it appears that if I call prepare() for my SQL and cache the prepared statement for later, if I then start a new transaction and call execute() on the statement, it commits the transaction. Is this behavior intentional? If so, does that mean I have to prepare my statement anew for every transaction?
Note that I'm seeing the aforementioned behavior with code as basic as the following:
$stmt = $dbh->prepare("INSERT INTO test_table (id, description) VALUES
$stmt->execute(array(":my*id" => 1, ":my*desc" => "test"));
After executing the above, a record has been committed to the db. If I had a more complex scenario involving a transaction with multiple statements where the entire transaction is inside a loop, this becomes problematic--I can't then prepare my statements outside the loop to improve performance.
When I try the same thing using straight PDO, it works fine. Can anyone else confirm this behavior?
Comment created by @beberlei:
Are you using PDO_OCI or oci8 with Doctrine?
Comment created by dpb587:
I had responded to him on our intranet and intended to submit a patch, but haven't yet found the time to prepare and test one. As a temporary workaround I suggested he prepare the statement inside the transaction. We are using oci8 and the following was my response and analysis:
When the doctrine2 oci8 driver prepares a statement, the generated statement will forever use the active execute mode, regardless of the mode when it's actually executed. I disagree with the current behavior.
As you noted, this is not the behavior used by PDO OCI. Short-term, I think you should prepare the statement inside a transaction. Long-term, I think we should submit a patch to doctrine2, something like follows:
Created an independent test - https://gist.github.com/2515100
Submitted a pull request - #137
Issue was closed with resolution "Fixed"