v5:userguide:transactions
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
userguide:transactions [2015/12/29 20:24] – mnewnham | v5:userguide:transactions [2020/08/26 10:09] (current) – [Usage] Add braces as suggested by @peterdd in #629 dregad | ||
---|---|---|---|
Line 1: | Line 1: | ||
======Transaction Handling In ADOdb ====== | ======Transaction Handling In ADOdb ====== | ||
===== Overview ===== | ===== Overview ===== | ||
- | There are 2 ways of handling | + | There are 2 ways of overriding the default database transaction |
* Granular transactions allow full control of individual commits | * Granular transactions allow full control of individual commits | ||
* Smart transactions are easier to control | * Smart transactions are easier to control | ||
+ | |||
+ | ------------------------------------------- | ||
+ | |||
+ | ===== Default Behaviour ===== | ||
+ | <WRAP right info 300px> | ||
+ | MySQL myIsam tables are always granular, and ignore any transaction control methods coded. You cannot rollback or fail an update into that table type. Use InnoDB table types instead. | ||
+ | |||
+ | This also applies to any sequences that might have been updated in the transaction, | ||
+ | </ | ||
+ | If ADOdb transaction handling is not used, then the transaction handling method is controlled by whatever is set by the database. Possible methods are: | ||
+ | |||
+ | * Automatically creating granular updates | ||
+ | * Automatically rolling back the transactions at the end of procedures | ||
+ | * Failing unless a transaction handling method is assigned on connection | ||
---------------------------------------------- | ---------------------------------------------- | ||
+ | |||
===== Granular Transactions ===== | ===== Granular Transactions ===== | ||
<WRAP right box> | <WRAP right box> | ||
== Available Methods == | == Available Methods == | ||
- | [[reference: | + | [[v5:reference:connection: |
- | [[reference: | + | [[v5:reference:connection: |
- | [[reference: | + | [[v5:reference:connection: |
+ | == See Also == | ||
+ | [[v5: | ||
+ | [[v5: | ||
</ | </ | ||
When using granular transactions, | When using granular transactions, | ||
Line 28: | Line 46: | ||
$ok = $conn-> | $ok = $conn-> | ||
- | if ($ok) | + | if ($ok) { |
/* | /* | ||
* The previous execution succeeded, do some more | * The previous execution succeeded, do some more | ||
| | ||
$ok = $conn-> | $ok = $conn-> | ||
- | else | + | } else { |
/* | /* | ||
* Branch, do some other work, then return | * Branch, do some other work, then return | ||
*/ | */ | ||
- | if (!$ok) | + | } |
+ | |||
+ | if (!$ok) | ||
/* | /* | ||
- | * Test the last insertion, if not successful roll back the entire transaction scope | + | * Test the last insertion, if not successful roll |
+ | * back the entire transaction scope | ||
*/ | */ | ||
$conn-> | $conn-> | ||
- | else | + | } else { |
/* | /* | ||
* Go ahead and commit | * Go ahead and commit | ||
*/ | */ | ||
$conn-> | $conn-> | ||
+ | } | ||
</ | </ | ||
- | ==== Stacking Transactions ==== | ||
- | Granular transactions cannot be stacked, i.e. each '' | ||
----------------------------- | ----------------------------- | ||
===== Smart Transactions ===== | ===== Smart Transactions ===== | ||
<WRAP right box> | <WRAP right box> | ||
== Available Methods == | == Available Methods == | ||
- | [[reference: | + | [[v5:reference:connection: |
- | [[reference: | + | [[v5:reference:connection: |
- | [[reference: | + | [[v5:reference:connection: |
- | [[reference: | + | [[v5:reference:connection: |
+ | == See Also == | ||
+ | [[v5: | ||
+ | [[v5: | ||
</ | </ | ||
- | Smart Transactions are much easier to use in large procedures because you do not have to track the error status. You start a smart transaction by calling | + | Smart Transactions are much easier to use in large procedures because you do not have to track the error status. You start a smart transaction by calling |
<code php> | <code php> | ||
Line 70: | Line 93: | ||
* Execute some SQL | * Execute some SQL | ||
*/ | */ | ||
- | $conn->Execute($sql); | + | $conn->execute($sql); |
/* | /* | ||
* Execute some more SQL | * Execute some more SQL | ||
*/ | */ | ||
- | $conn->Execute($Sql2); | + | $conn->execute($sql2); |
/* | /* | ||
- | * Call completetrans. If any of the executions in the above code have failed, the transactions will roll back automatically | + | * Call completetrans. If any of the executions in the above |
+ | * code have failed, the transactions will roll back automatically | ||
*/ | */ | ||
$conn-> | $conn-> | ||
</ | </ | ||
- | CompleteTrans() detects when an SQL error occurs, and will Rollback/Commit as appropriate. | + | [[v5: |
- | You can force a rollback even if no error occured, using failTrans(). Note that the rollback is done in CompleteTrans(). | + | You can force a rollback even if no transactional |
<code php> | <code php> | ||
Line 92: | Line 116: | ||
$conn-> | $conn-> | ||
- | if (!CheckRecords()) | + | if (!checkRecords()) |
$conn-> | $conn-> | ||
- | $conn->Execute($Sql2); | + | /* |
+ | * Even though failTrans was issued before this statement, | ||
+ | * it will also be rolled back | ||
+ | */ | ||
+ | $conn->execute($sql2); | ||
- | $conn->CompleteTrans(); | + | $conn->completeTrans(); |
</ | </ | ||
- | You can also check if a transaction has failed, using HasFailedTrans(), which returns true if FailTrans() was called, | + | You can also check if a transaction has failed, using [[v5: |
+ | * if [[v5: | ||
+ | * There was an error in the SQL execution. | ||
- | Lastly, StartTrans/ | + | Make sure you call '' |
+ | |||
+ | |||
+ | ==== Nesting Transactions ==== | ||
+ | Smart Transactions are nestable, | ||
+ | |||
+ | The only caveat for nesting | ||
<code php> | <code php> | ||
- | $conn->StartTrans(); | + | /* |
+ | * Outer block, takes control of transactions | ||
+ | */ | ||
+ | $conn->startTrans(); | ||
- | $conn->Execute($sql); | + | $conn->execute($sql); |
- | $conn->StartTrans(); # ignored | + | /* |
- | if (!CheckRecords()) | + | * This is ignored |
- | $conn->FailTrans(); | + | */ |
+ | $conn->startTrans(); | ||
+ | if (!checkRecords()) | ||
+ | /* | ||
+ | * This is applied to the outer block | ||
+ | */ | ||
+ | $conn->failTrans(); | ||
- | $conn-> | + | /* |
- | $conn-> | + | * This is ignored |
- | $conn->CompleteTrans(); | + | */ |
- | </ | + | $conn->completeTrans(); |
- | Note: Savepoints are currently not supported. | + | |
+ | $conn-> | ||
+ | /* | ||
+ | * This completes the transaction scope | ||
+ | */ | ||
+ | $conn-> | ||
+ | </ | ||
+ | ==== Savepoints ==== | ||
+ | Savepoints are currently not supported. |
v5/userguide/transactions.1451417074.txt.gz · Last modified: 2017/04/21 11:39 (external edit)