mysqli::begin_transaction

mysqli_begin_transaction

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

mysqli::begin_transaction -- mysqli_begin_transactionStartet eine Transaktion

Beschreibung

Objektorientierter Stil

public mysqli::begin_transaction(int $flags = 0, ?string $name = null): bool

Prozeduraler Stil:

mysqli_begin_transaction(mysqli $mysql, int $flags = 0, ?string $name = null): bool

Beginnt eine Transaktion; benötigt die InnoDB-Engine (sie ist standardmäßig aktiviert). Für weitere Details über die Funktionsweise von MySQL-Transaktionen siehe » http://dev.mysql.com/doc/mysql/en/commit.html.

Parameter-Liste

mysql

Nur bei prozeduralem Aufruf: ein von mysqli_connect() oder mysqli_init() zurückgegebenes mysqli-Objekt.

flags

Gültige Flags sind:

  • MYSQLI_TRANS_START_READ_ONLY: Startet die Transaktion als "START TRANSACTION READ ONLY" (nur lesend). Benötigt MySQL 5.6 oder höher.

  • MYSQLI_TRANS_START_READ_WRITE: Startet die Transaktion als "START TRANSACTION READ WRITE" (lesend und schreibend). Benötigt MySQL 5.6 oder höher.

  • MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOT: Startet die Transaktion als "START TRANSACTION WITH CONSISTENT SNAPSHOT".

name

Name des Sicherungspunkts für die Transaktion

Rückgabewerte

Gibt bei Erfolg true zurück. Bei einem Fehler wird false zurückgegeben.

Changelog

Version Beschreibung
8.0.0 name ist nun nullable (akzeptiert den null-Wert).

Beispiele

Beispiel #1 mysqli::begin_transaction()-Beispiel

Objektorientierter Stil

<?php

/* mysqli anweisen, eine Ausnahme auszulösen, wenn ein Fehler auftritt */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Die Tabellen-Engine muss Transaktionen unterstützen */
$mysqli->query("CREATE TABLE IF NOT EXISTS language (
Code text NOT NULL,
Speakers int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
);

/* Transaktion starten */
$mysqli->begin_transaction();

try {
/* Ein paar Werte einfügen */
$mysqli->query("INSERT INTO language(Code, Speakers) VALUES ('DE', 42000123)");

/* Versuchen, ungültige Werte einzufügen */
$language_code = 'FR';
$native_speakers = 'Unknown';
$stmt = $mysqli->prepare('INSERT INTO language(Code, Speakers) VALUES (?,?)');
$stmt->bind_param('ss', $language_code, $native_speakers);
$stmt->execute();

/* Wenn der Code bis hierher fehlerfrei ist, die Daten in der Datenbank bestätigen */
$mysqli->commit();
} catch (
mysqli_sql_exception $exception) {
$mysqli->rollback();

throw
$exception;
}

Prozeduraler Stil

<?php

/* mysqli anweisen, eine Ausnahme auszulösen, wenn ein Fehler auftritt */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

/* Die Tabellen-Engine muss Transaktionen unterstützen */
mysqli_query($mysqli, "CREATE TABLE IF NOT EXISTS language (
Code text NOT NULL,
Speakers int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
);

/* Transaktion starten */
mysqli_begin_transaction($mysqli);

try {
/* Ein paar Werte einfügen */
mysqli_query($mysqli, "INSERT INTO language(Code, Speakers) VALUES ('DE', 42000123)");

/* Versuchen, ungültige Werte einzufügen */
$language_code = 'FR';
$native_speakers = 'Unknown';
$stmt = mysqli_prepare($mysqli, 'INSERT INTO language(Code, Speakers) VALUES (?,?)');
mysqli_stmt_bind_param($stmt, 'ss', $language_code, $native_speakers);
mysqli_stmt_execute($stmt);

/* Wenn der Code bis hierher fehlerfrei ist, die Daten in der Datenbank bestätigen */
mysqli_commit($mysqli);
} catch (
mysqli_sql_exception $exception) {
mysqli_rollback($mysqli);

throw
$exception;
}

Anmerkungen

Hinweis:

Diese Funktion funktioniert nicht mit Tabellentypen, die keine Transaktionen unterstützen (wie MyISAM oder ISAM).

Siehe auch

add a note add a note

User Contributed Notes 4 notes

up
6
Ral
6 years ago
If you receive errors like: "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required" with versions of MariaDB that DO support them, this is due to an internal check in mysqli conflicting with a hack in MariaDB to allow replication with oracle mysql.

MariaDB prefixes its server version numbers with "5.5.5-" for example "5.5.5-10.3.7-MariaDB-1:10.3.7+maria~stretch". This is because oracle mysql would interpet the "10" as version 1. Mysql clients aware of MariaDB have been updated to detect and strip this prefix.

However the check for mysqli.begin-transaction sees the 5.5.5 prefix and so fails.

The workaround is to specify a custom version string without the prefix for MariaDB on the command line using the --version option. Then mysqli.begin-transaction functions as expected.
up
2
PHP Guru
4 years ago
MySQL 5.6 introduces READ ONLY mode which applies optimizations to your transactions that can only be applied when it knows in advance that no table modifications will be made and that no locks will be issued.

The default access mode is READ WRITE in all versions up to and including MySQL 5.6. Starting in MySQL 5.7, the appropriate access mode is detected automatically. So if your transaction attempts modifications or table locks, it will automatically use READ WRITE mode, otherwise it will use READ ONLY mode and your transaction will benefit from the optimizations that come from that without having to explicitly declare is as READ ONLY.

Therefore the only time you need to explicitly declare an access mode is when you are using MySQL 5.6 and you are sure that you want READ ONLY mode. Note that any queries that attempt to modify tables or issue locks in READ ONLY mode will fail. Temporary tables can still be modified.

(Moderators. This post should replace the previous post that I made on the subject. Thanks.)
up
1
VasK@hapir
5 years ago
The above answer from Ral worked for us, Thanks a lot. This is how we implemented the proposed workaround for

Warning: mysqli_begin_transaction(): This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required

We appended the following line to /etc/my.cnf and restarted MySQL server

version=10.2.19-MariaDB
up
0
Luc
8 years ago
For PHP<5.5:

    mysqli_query($db, "START TRANSACTION");
To Top