For PHP<5.5:
mysqli_query($db, "START TRANSACTION");
(PHP 5 >= 5.5.0, PHP 7)
mysqli::begin_transaction -- mysqli_begin_transaction — Стартует транзакцию
Объектно-ориентированный стиль
$flags
= 0
, string|null $name
= null
) : boolПроцедурный стиль:
Стартует транзакцию. Требуется InnoDB (разрешён по умолчанию). Для дополнительной информации, как работают транзакции в MySQL, читайте » http://dev.mysql.com/doc/mysql/en/commit.html.
link
Только для процедурного стиля: Идентификатор соединения, полученный с помощью mysqli_connect() или mysqli_init()
flags
Корректные флаги:
MYSQLI_TRANS_START_READ_ONLY
:
Стартовать транзакцию как "START TRANSACTION READ ONLY".
Требуется MySQL 5.6 или выше.
MYSQLI_TRANS_START_READ_WRITE
:
Стартовать транзакцию как "START TRANSACTION READ WRITE".
Требуется MySQL 5.6 или выше.
MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOT
:
Стартовать транзакцию как "START TRANSACTION WITH CONSISTENT SNAPSHOT".
name
Точка сохранения транзакции.
Возвращает true
в случае успешного завершения или false
в случае возникновения ошибки.
Замечание:
Функция не работает с нетранзакционными типами таблиц (такими как MyISAM или ISAM).
Версия | Описание |
---|---|
8.0.0 |
name теперь допускает значение null.
|
Пример #1 Пример использования mysqli::begin_transaction()
Объектно-ориентированный стиль
<?php
/* Указать mysqli выбрасывать исключение в случае возникновения ошибки */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* Движок таблиц должен поддерживать транзакции */
$mysqli->query("CREATE TABLE IF NOT EXISTS language (
Code text NOT NULL,
Speakers int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
/* Начало транзакции */
$mysqli->begin_transaction();
try {
/* Добавление каких-то значений */
$mysqli->query("INSERT INTO language(Code, Speakers) VALUES ('DE', 42000123)");
/* Попытка добавить недопустимые значения */
$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();
/* Если код достигает этой точки без ошибок, фиксируем данные в базе данных. */
$mysqli->commit();
} catch (mysqli_sql_exception $exception) {
$mysqli->rollback();
throw $exception;
}
Процедурный стиль
<?php
/* Указать mysqli выбрасывать исключение в случае возникновения ошибки */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");
/* Движок таблиц должен поддерживать транзакции */
mysqli_query($mysqli, "CREATE TABLE IF NOT EXISTS language (
Code text NOT NULL,
Speakers int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
/* Начало транзакции */
mysqli_begin_transaction($mysqli);
try {
/* Добавление каких-то значений */
mysqli_query($mysqli, "INSERT INTO language(Code, Speakers) VALUES ('DE', 42000123)");
/* Попытка добавить недопустимые значения */
$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);
/* Если код достигает этой точки без ошибок, фиксируем данные в базе данных. */
mysqli_commit($mysqli);
} catch (mysqli_sql_exception $exception) {
mysqli_rollback($mysqli);
throw $exception;
}
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.
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