}
public function begin_sql() {
+ if (!parent::begin_sql()) {
+ return false;
+ }
$this->adodb->BeginTrans();
return true;
}
public function commit_sql() {
+ if (!parent::commit_sql()) {
+ return false;
+ }
$this->adodb->CommitTrans();
return true;
}
public function rollback_sql() {
+ if (!parent::rollback_sql()) {
+ return false;
+ }
$this->adodb->RollbackTrans();
return true;
}
protected $used_for_db_sessions = false;
+ /** Flag indicating transaction in progress */
+ protected $intransaction = false;
+
/** internal temporary variable */
private $fix_sql_params_i;
* Do NOT use connect() again, create a new instance if needed.
*/
public function dispose() {
+ if ($this->intransaction) {
+ error_log('Active database transaction detected when disposing database!'); // probably can not write to console anymore, log problem instead
+ }
if ($this->used_for_db_sessions) {
// this is needed because we need to save session to db before closing it
session_get_instance()->write_close();
* you'll need to ensure you call commit_sql() or your changes *will* be lost.
*
* this is _very_ useful for massive updates
+ *
+ * Please note only one level of transactions is supported, please do not use
+ * transaction in moodle core! Transaction are intended for web services
+ * enrolment and auth synchronisation scripts, etc.
+ *
+ * @return bool success
*/
public function begin_sql() {
- return false;
+ if ($this->intransaction) {
+ debugging('Transaction already in progress');
+ return false;
+ }
+ $this->intransaction = true;
+ return true;
}
/**
* on DBs that support it, commit the transaction
+ * @return bool success
*/
public function commit_sql() {
- return false;
+ if (!$this->intransaction) {
+ debugging('Transaction not in progress');
+ return false;
+ }
+ $this->intransaction = false;
+ return true;
}
/**
* on DBs that support it, rollback the transaction
+ * @return bool success
*/
public function rollback_sql() {
- return false;
+ if (!$this->intransaction) {
+ debugging('Transaction not in progress');
+ return false;
+ }
+ $this->intransaction = false;
+ return true;
}
/// session locking
* this is _very_ useful for massive updates
*/
public function begin_sql() {
+ if (!parent::begin_sql()) {
+ return false;
+ }
$sql = "SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED";
$this->query_start($sql, NULL, SQL_QUERY_AUX);
$result = $this->mysqli->query($sql);
* on DBs that support it, commit the transaction
*/
public function commit_sql() {
+ if (!parent::commit_sql()) {
+ return false;
+ }
$sql = "COMMIT";
$this->query_start($sql, NULL, SQL_QUERY_AUX);
$result = $this->mysqli->query($sql);
* on DBs that support it, rollback the transaction
*/
public function rollback_sql() {
+ if (!parent::rollback_sql()) {
+ return false;
+ }
$sql = "ROLLBACK";
$this->query_start($sql, NULL, SQL_QUERY_AUX);
$result = $this->mysqli->query($sql);
* this is _very_ useful for massive updates
*/
public function begin_sql() {
- return false;
+ if (!parent::begin_sql()) {
+ return false;
+ }
+ return true;
$sql = "BEGIN";
$this->query_start($sql, NULL, SQL_QUERY_AUX);
* on DBs that support it, commit the transaction
*/
public function commit_sql() {
- return false;
+ if (!parent::commit_sql()) {
+ return false;
+ }
+ return true;
$sql = "COMMIT";
$this->query_start($sql, NULL, SQL_QUERY_AUX);
* on DBs that support it, rollback the transaction
*/
public function rollback_sql() {
- return false;
+ if (!parent::rollback_sql()) {
+ return false;
+ }
+ return true;
$sql = "ROLLBACK";
$this->query_start($sql, NULL, SQL_QUERY_AUX);
}
public function begin_sql() {
+ if (!parent::begin_sql()) {
+ return false;
+ }
try {
$this->pdb->beginTransaction();
return true;
}
}
public function commit_sql() {
+ if (!parent::commit_sql()) {
+ return false;
+ }
try {
$this->pdb->commit();
return true;
}
public function rollback_sql() {
+ if (!parent::rollback_sql()) {
+ return false;
+ }
try {
$this->pdb->rollBack();
return true;
* this is _very_ useful for massive updates
*/
public function begin_sql() {
+ if (!parent::begin_sql()) {
+ return false;
+ }
$sql = "BEGIN ISOLATION LEVEL READ COMMITTED";
$this->query_start($sql, NULL, SQL_QUERY_AUX);
$result = pg_query($this->pgsql, $sql);
* on DBs that support it, commit the transaction
*/
public function commit_sql() {
+ if (!parent::commit_sql()) {
+ return false;
+ }
$sql = "COMMIT";
$this->query_start($sql, NULL, SQL_QUERY_AUX);
$result = pg_query($this->pgsql, $sql);
* on DBs that support it, rollback the transaction
*/
public function rollback_sql() {
+ if (!parent::rollback_sql()) {
+ return false;
+ }
$sql = "ROLLBACK";
$this->query_start($sql, NULL, SQL_QUERY_AUX);
$result = pg_query($this->pgsql, $sql);