Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310

Не работает транзакция

22.01.2025, 16:38. Показов 782. Ответов 14

Студворк — интернет-сервис помощи студентам
Добрый день! Случилась такая история. Есть код
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../config/boot.php';
if (!isset($_SESSION['username'])) {
    header('Location: login.php');
    exit;
}
try {
    $pdo = pdo();
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $clientId = $_POST['id'];
    $nal = is_numeric($_POST['nalminus']) ? -abs($_POST['nalminus']) : 0;
    $kassa = is_numeric($_POST['kassaminus']) ? -abs($_POST['kassaminus']) : 0;
    $ekv = is_numeric($_POST['ekvminus']) ? -abs($_POST['ekvminus']) : 0;
    $transfer = is_numeric($_POST['transferminus']) ? -abs($_POST['transferminus']) : 0;
    $payment_accountminus = is_numeric($_POST['payment_accountminus']) ? -abs($_POST['payment_accountminus']) : 0;
    $comment = $_POST['commentminus'];
 
 
    $pdo->beginTransaction();
 
 
    $stmt = $pdo->prepare("SELECT name, site_id, dolg FROM users WHERE id = :id");
    $stmt->bindParam(':id', $clientId);
    $stmt->execute();
    $clientData = $stmt->fetch();
    $dolg = $clientData['dolg'];
 
    if (!$clientData) {
        $pdo->rollBack();
        echo json_encode(['status' => 'error', 'message' => 'Клиент не найден.']);
        return;
    }
    $office = $_SESSION['office'];
    $manager_name = $_SESSION['username'];
    if (empty($nal)) $nal = 0;
    if (empty($kassa)) $kassa = 0;
    if (empty($ekv)) $ekv = 0;
    if (empty($transfer)) $transfer = 0;
    if (empty($payment_accountminus)) $payment_accountminus = 0;
    $shipment = 0;
    // Операция 1. Сохранить данные в таблицу kassa
    $stmt1 = $pdo->prepare("INSERT INTO kassa (date, name, site_id, user_id, cash, kassa, acquiring, transfer, payment_account, shipment, comment, office, manager_name) VALUES (:date, :name, :site_id, :user_id, :cash, :kassa, :acquiring, :transfer, :payment_account, :shipment, :comment, :office, :manager_name)");
    date_default_timezone_set('Europe/Moscow');
    $todayDate = date('Y-m-d H:i:s');
    $stmt1->bindParam(':date', $todayDate);
    $stmt1->bindParam(':name', $clientData['name']);
    $stmt1->bindParam(':site_id', $clientData['site_id']);
    $stmt1->bindParam(':user_id', $clientId);
    $stmt1->bindParam(':cash', $nal);
    $stmt1->bindParam(':kassa', $kassa);
    $stmt1->bindParam(':acquiring', $ekv);
    $stmt1->bindParam(':transfer', $transfer);
    $stmt1->bindParam(':payment_account', $payment_accountminus);
    $stmt1->bindParam(':shipment', $shipment);
    $stmt1->bindParam(':comment', $comment);
    $stmt1->bindParam(':office', $office);
    $stmt1->bindParam(':manager_name', $manager_name);
    $stmt1->execute();
    $sumall = (int)$nal + (int)$kassa + (int)$ekv + (int)$transfer + (int)$payment_accountminus;
    $dolg = (int)$clientData['dolg'] + $sumall;
 // Операция 2. Обновление долга
    $stmt2 = $pdo->prepare("UPDATE users SET dolg = :dolg WHERE id = :id");
    $stmt2->bindParam(':dolg', $dolg);
    $stmt2->bindParam(':id', $clientId);
    $stmt2->execute();
    $pdo->commit();
    echo json_encode(['status' => 'success']);
} catch (PDOException $e) {
    $pdo->rollBack();
    echo json_encode(['status' => 'error', 'message' => 'Ошибка: ' . $e->getMessage()]);
}
Во время работы транзакции происходит подвисание инета и в итоге первая операция внесения в кассу происходит нормально, а вторая операция изменение баланса клиента не происходит. Для чего тогда нужна транзакция или я не верно ее использую? Перед выполнением транзакции я проверяю подключение к БД и затем выполняю ее. Как этого избежать? Как решить проблему целостности или атомарности. Если можно то простыми словами, кодом.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.01.2025, 16:38
Ответы с готовыми решениями:

Не работает транзакция
Есть таблица в формате innoDB. Пытаюсь выполнить транзакцию, а инструкции выполняются сразу же, не дожидаясь подтверждения. Из-за чего это...

Не работает транзакция
Здравствуйте! Пытаюсь выполнить транзакцию при помощи которой необходимо списать денежные средства c одного счета и зачислить на другой: ...

Не работает транзакция MySQL
Не понимаю, таблица newTable уже существует, при этом запись в таблицу organization все ровно записывается, хотя не должна так как выходит...

14
Native x86
Эксперт Hardware
 Аватар для quwy
6781 / 3716 / 1019
Регистрация: 13.02.2013
Сообщений: 11,695
22.01.2025, 19:26
БД какая? Не все базы (и не все движки в некоторых базах) поддерживают транзакции.
0
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
23.01.2025, 17:20  [ТС]
Цитата Сообщение от quwy Посмотреть сообщение
БД какая? Не все базы (и не все движки в некоторых базах) поддерживают транзакции.
Mysql InnoDB
0
Native x86
Эксперт Hardware
 Аватар для quwy
6781 / 3716 / 1019
Регистрация: 13.02.2013
Сообщений: 11,695
23.01.2025, 17:57
Цитата Сообщение от gena8208 Посмотреть сообщение
Mysql InnoDB
Он-то транзакции поддерживает, но вы как-то не правильно представляете себе работу серверных скриптов.

Цитата Сообщение от gena8208 Посмотреть сообщение
Во время работы транзакции происходит подвисание инета
"Подвисание интернета" на работу PHP-скрипта влияет весьма опосредственно. Не прервется скрипт мгновенно при пропадании связи с клиентом. На "осознание" проблемы сетевому стеку нужно как минимум несколько секунд (или даже десятков секунд). Причем это время должно пройти пока открыта транзакция.

В коде у вас все выглядит правильно, но проблема скорее всего в другом месте.
0
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
23.01.2025, 18:12  [ТС]
Цитата Сообщение от quwy Посмотреть сообщение
В коде у вас все выглядит правильно, но проблема скорее всего в другом месте.
Оператор вносит в кассу сумму. Инет подвис. Видимо (мое предположение)она не дождалась статус что данные внесены или статус обо ошибке. Она несколько раз жмет кнопку сохранить . Потом инет отвисает. В таблице касса появляется несколько одинаковых записей. А в таблице клиент баланс клиента не обновился

Добавлено через 3 минуты
Цитата Сообщение от quwy Посмотреть сообщение
"Подвисание интернета" на работу PHP-скрипта влияет весьма опосредственно.
При нажатии кнопки сохранить должно появляться сообщение что данные внесены и модальное окно закрывается. но оно не закрылось и сообщения об ошибке не появилось и что данные не сохранены не было сообщения. С этим файлом работает 10 операторов и только у одного случилось это за все время работы. сейчас я сделал логирование операций но это тоже не защитит от глюков, наверное.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../config/boot.php';
if (!isset($_SESSION['username'])) {
    header('Location: login.php');
    exit;
}
try {
    $pdo = pdo();
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
    $clientId = $_POST['id'];
    $nal = $_POST['cash'];
    $kassa = $_POST['kassa'];
    $ekv = $_POST['acquiring'];
    $transfer = $_POST['transfer'];
    $payment_account = $_POST['payment_account'];
    $comment = $_POST['comment'];
 
    $pdo->beginTransaction();
 
 
    $stmt = $pdo->prepare("SELECT name, site_id, dolg FROM users WHERE id = :id");
    $stmt->bindParam(':id', $clientId);
    $stmt->execute();
    $clientData = $stmt->fetch();
    $dolg = $clientData['dolg'];
 
    if (!$clientData) {
        $pdo->rollBack();
        echo json_encode(['status' => 'error', 'message' => 'Клиент не найден.']);
        return;
    }
    $office = $_SESSION['office'];
    $manager_name = $_SESSION['username'];
    if (empty($nal)) $nal = 0;
    if (empty($kassa)) $kassa = 0;
    if (empty($ekv)) $ekv = 0;
    if (empty($transfer)) $transfer = 0;
    if (empty($payment_account)) $payment_account = 0;
    $shipment = 0;
    // сохранить данные в таблицу kassa
    $stmt1 = $pdo->prepare("INSERT INTO kassa (date, name, site_id, user_id, cash, kassa, acquiring, transfer, payment_account, shipment, comment, office, manager_name) VALUES (:date, :name, :site_id, :user_id, :cash, :kassa, :acquiring, :transfer, :payment_account, :shipment, :comment, :office, :manager_name)");
    date_default_timezone_set('Europe/Moscow');
    $todayDate = date('Y-m-d H:i:s');
    $stmt1->bindParam(':date', $todayDate);
    $stmt1->bindParam(':name', $clientData['name']);
    $stmt1->bindParam(':site_id', $clientData['site_id']);
    $stmt1->bindParam(':user_id', $clientId);
    $stmt1->bindParam(':cash', $nal);
    $stmt1->bindParam(':kassa', $kassa);
    $stmt1->bindParam(':acquiring', $ekv);
    $stmt1->bindParam(':transfer', $transfer);
    $stmt1->bindParam(':payment_account', $payment_account);
    $stmt1->bindParam(':shipment', $shipment);
    $stmt1->bindParam(':comment', $comment);
    $stmt1->bindParam(':office', $office);
    $stmt1->bindParam(':manager_name', $manager_name);
    $stmt1->execute();
    $logMessage = "";
    $logMessage = "[" . $todayDate . "] Операция: Внесение данных в таблицу kassa\n";
    $logMessage .= "clientId: " . $clientId . ", nal: " . $nal . ", kassa: " . $kassa . ", ekv: " . $ekv . ", transfer: " . $transfer . ", payment_account: " . $payment_account . ", comment: " . $comment . ", office: " . $office . ", manager_name: " . $manager_name . "\n";
    error_log($logMessage, 3, 'logs/vnesenie_v_kasse.log');
    $sumall = (int)$nal + (int)$kassa + (int)$ekv + (int)$transfer + (int)$payment_account;
    $dolg = (int)$clientData['dolg'] + $sumall;
    $stmt2 = $pdo->prepare("UPDATE users SET dolg = :dolg WHERE id = :id");
    $stmt2->bindParam(':dolg', $dolg);
    $stmt2->bindParam(':id', $clientId);
    $stmt2->execute();
    $logMessage = "";
    $logMessage = "[" . $todayDate . "] Операция: Обновление баланса клиента в таблице users\n";
    $logMessage .= "clientId: " . $clientId . ", dolg: " . $dolg . "\n";
    error_log($logMessage, 3, 'logs/vnesenie_v_kasse.log');
    $pdo->commit();
    echo json_encode(['status' => 'success']);
} catch (PDOException $e) {
    $pdo->rollBack();
    echo json_encode(['status' => 'error', 'message' => 'Ошибка: ' . $e->getMessage()]);
}
Добавлено через 6 минут
Цитата Сообщение от gena8208 Посмотреть сообщение
логирование операций но это тоже не защитит от глюков, наверное.
создал логирование ....
0
Невнимательный
 Аватар для ft4l
2815 / 1191 / 354
Регистрация: 08.02.2013
Сообщений: 6,877
Записей в блоге: 2
23.01.2025, 18:32
gena8208, как-то можно проверить влияет-ли ?
PHP
1
ignore_user_abort(1);
Не совсем понял, но думаю такое возможно, если выполняется запрос START TRANSACTION,
какое-то добавление, а потом скрипт просто завершает работу... без COMMIT/ROLLBACK
изначально вроде так и было реализовано
By default, MySQL runs with autocommit mode enabled. This means that as soon as you execute a statement that updates (modifies) a table, MySQL stores the update on disk to make it permanent. To disable autocommit mode, use the following statement:
SET autocommit=0;
... хотя не знаю чего там под капотом pdo, и доки к mysql у меня древние ))

Не по теме:

Как вариант ещё попробовать COMMIT и ROLLBACK в функции где-то реализовать, и зарегистрировать её с

PHP
1
register_shutdown_function(callable $callback, mixed ...$args): ?bool
Выполнится даже в случае ошибок/прерывания
но тоже костыль, и передавать/получать кучу всего... объект pdo, перевменную какую насчёт всё-ли выполнено

1
Эксперт PHP
3897 / 3235 / 1353
Регистрация: 01.08.2012
Сообщений: 10,899
23.01.2025, 18:36
Цитата Сообщение от gena8208 Посмотреть сообщение
происходит подвисание инета
Надо дебажить, что именно подвисает. Если база - по какой причине? Может не хватает кол-ва одновременных подключений или каких ресурсов.

Цитата Сообщение от gena8208 Посмотреть сообщение
В таблице касса появляется несколько одинаковых записей. А в таблице клиент баланс клиента не обновился
Вообще в скрипте есть стандартная проблема, о которой любят спрашивать на собесах - отсутствие обработки конкурентного доступа. Запускаем скрипт одновременно несколько раз - и каждая транзакция будет параллельно выполнять SELECT + INSERT + UPDATE несмотря на другие транзакции. В итоге UPDATE по сути сработает только один (последний), он перезапишет результат предыдущих апдейтов.

Условно, у юзера баланс 100 рублей. Запускается 2 транзакции, каждая на списание 70 рублей. Каждая видит, что у юзера баланс 100, исходя из этого оформляет покупку и обновляет баланс на 30р. В итоге оформилось 2 заказа суммарно на 140р, а у юзера списалось только 70.

Для решения проблемы используем блокирующее чтение, т.е. SELECT ... FOR UPDATE.

Думаю в вашем случае это вполне может быть оно, т.к. подвисает база, и после отвисания срабатывают сразу несколько транзакций, ожидающих выполнения.
1
23.01.2025, 18:40

Не по теме:

Цитата Сообщение от ft4l Посмотреть сообщение
ignore_user_abort(1)
Хотя там да... тормоза перед тем как php может поймать отмену/прерывание
PHP не обнаружит, что пользователь прервал соединение до тех пор, пока не будет произведена попытка отправки информации клиенту. Простое использование выражения echo не гарантирует отправку информации, смотрите функцию flush().

0
Эксперт PHP
3897 / 3235 / 1353
Регистрация: 01.08.2012
Сообщений: 10,899
23.01.2025, 19:06
Цитата Сообщение от gena8208 Посмотреть сообщение
Она несколько раз жмет кнопку сохранить
К слову, это тоже типовая проблема, решение - ключ идемпотентности.
1
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
23.01.2025, 20:48  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
К слову, это тоже типовая проблема, решение - ключ идемпотентности.
Цитата Сообщение от ft4l Посмотреть сообщение
Не по теме:
Цитата Сообщение от Jodah Посмотреть сообщение
Надо дебажить, что именно подвисает. Если база - по какой причине?
База лежит на хостинге рег.ру. Может и у них с сервером проблема. ИИ подсказывает что надо передать переменные на сервер а там производить транзакцию с помощью хранимой процедуры или делать тригеры и проверять операция завершена или нет и еще можно логировать статус операции ... вариантов много, но мне понравился вариант передать переменные на сервер а там производить транзакцию с помощью хранимой процедуры Ведь под самой базой а не через php транзакция либо пройдет либо откатится. Возможно я ошибаюсь. Не настолько спец. Всем спасибо буду думать. Если есть мысли, буду рад ознакомиться

Добавлено через 1 минуту
Цитата Сообщение от Jodah Посмотреть сообщение
К слову, это тоже типовая проблема, решение - ключ идемпотентности.
про это тоже инфу поищу.

Добавлено через 4 минуты
Цитата Сообщение от Jodah Посмотреть сообщение
К слову, это тоже типовая проблема, решение - ключ идемпотентности.
Да именно об этом писал ИИ но другими словами. Отличная информация, познавательная. Спасибо
0
 Аватар для sad67man
2485 / 1409 / 667
Регистрация: 23.08.2015
Сообщений: 3,558
23.01.2025, 22:15
Цитата Сообщение от gena8208 Посмотреть сообщение
Оператор вносит в кассу сумму. Инет подвис. Видимо (мое предположение)она не дождалась статус что данные внесены или статус обо ошибке. Она несколько раз жмет кнопку сохранить . Потом инет отвисает. В таблице касса появляется несколько одинаковых записей. А в таблице клиент баланс клиента не обновился
1) Запуск одновременно несколько операций над одной записью лучше не допускать, чтоб как раз избегать таких плавающих ошибок... Для этого нужно делать блокировки.
2) Операция должна быть идемпотентна. Чтоб если вы запускали несколько раз одну и туже операцию - в итоге получили один результат, как будто бы выполнили эту операцию один раз. Для этого и необходим ключ идемпотентности.

У вас оба пункта не выполнены.

Цитата Сообщение от gena8208 Посмотреть сообщение
PHP
1
2
$dolg = (int)$clientData['dolg'] + $sumall;
    $stmt2 = $pdo->prepare("UPDATE users SET dolg = :dolg WHERE id = :id");
Вот тут проблема. Если параллельно запустить несколько операций, то начальный остаток будет одинаков и последняя транзакция затрет баланс. Тут и еще такой подход, что теоретически данные могут разойтись, хорошо когда их можно актуализировать т.е. пересчитать баланс.
0
Эксперт PHP
3897 / 3235 / 1353
Регистрация: 01.08.2012
Сообщений: 10,899
23.01.2025, 23:12
Цитата Сообщение от gena8208 Посмотреть сообщение
База лежит на хостинге рег.ру.
Если это виртуальный хостинг, а не VPS/VDS, то подвисания - норма, т.к. провайдеры обычно не гарантируют постоянный доступ к выделенным ресурсам.

Цитата Сообщение от gena8208 Посмотреть сообщение
передать переменные на сервер а там производить транзакцию с помощью хранимой процедуры
Это не решит проблему.

Цитата Сообщение от gena8208 Посмотреть сообщение
Ведь под самой базой а не через php транзакция либо пройдет либо откатится.
Под PHP она точно также либо пройдёт, либо откатится, в этом смысл транзакций. Выполняются они ведь также в СУБД.

Цитата Сообщение от gena8208 Посмотреть сообщение
Если есть мысли, буду рад ознакомиться
Думается, вы грешите на PHP, дескать он плохо с транзакциями работает. Но нет, проблема архитектурная, а PHP всё делает как надо, просто при множественных запросах вы не видите, как один UPDATE запрос перекрывается другим.
0
4 / 4 / 1
Регистрация: 20.12.2019
Сообщений: 310
26.01.2025, 10:32  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
1) Запуск одновременно несколько операций над одной записью лучше не допускать, чтоб как раз избегать таких плавающих ошибок... Для этого нужно делать блокировки.
2) Операция должна быть идемпотентна. Чтоб если вы запускали несколько раз одну и туже операцию - в итоге получили один результат, как будто бы выполнили эту операцию один раз. Для этого и необходим ключ идемпотентности.
С одной записью работает один оператор. Если сделать так, например, когда оператор нажал кнопку сохранить то кнопка сохранить становится неактивной, чтобы транзакция прошла успешно или выдала ошибку что операция не выполнена? Или это не правильный подход?
Цитата Сообщение от Jodah Посмотреть сообщение
Думается, вы грешите на PHP, дескать он плохо с транзакциями работает. Но нет, проблема архитектурная, а PHP всё делает как надо, просто при множественных запросах вы не видите, как один UPDATE запрос перекрывается другим.
Я это предполагаю. При первом нажатии не было сообщения об успехе или ошибка поскольку инет подвис. Они начали нажимать несколько раз. В итоге первая транзакция не прошла а остальные прошли и баланс несколько раз изменился. Самый простой способ я думаю блокировать кнопку сохранения после первого клика пока транзакция не пройдет успешно или выдаст ошибку. МОжет глупо конечно

Добавлено через 31 секунду
Цитата Сообщение от Jodah Посмотреть сообщение
Если это виртуальный хостинг, а не VPS/VDS, то подвисания - норма, т.к. провайдеры обычно не гарантируют постоянный доступ к выделенным ресурсам.
Да именно виртуальный хостинг

Добавлено через 5 минут
Цитата Сообщение от Jodah Посмотреть сообщение
Думается, вы грешите на PHP, дескать он плохо с транзакциями работает. Но нет, проблема архитектурная, а PHP всё делает как надо, просто при множественных запросах вы не видите, как один UPDATE запрос перекрывается другим.
Да именно так я и думал)). Сейчас логирую все транзакции чтобы хоть понять в какой момент что не внеслось и чтобы суммы не терялись. Это пока единичный случай был, но он был. И предполагать я этого не мог, т.к. в первые CRUD через сайт делал. Раньше писал проги на C# дял CRUD. Там проблем с этим не было

Добавлено через 21 минуту
Цитата Сообщение от sad67man Посмотреть сообщение
Запуск
Цитата Сообщение от Jodah Посмотреть сообщение
Думается
ИИ подсказал такую вещь. При выполнении транзакции делать прорверку на изменение ячейки. Изменения произошли то транзакция успешна, иначе откат.
Пример
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
START TRANSACTION;
 
UPDATE users
SET name = 'Новое имя', age = 30
WHERE id = 123;
 
-- Проверяем, было ли поле name изменено
SELECT name FROM users WHERE id = 123;
 
IF ROW_COUNT() = 0 THEN
  ROLLBACK;
ELSE
  COMMIT;
END IF;
В примере, который я дал ранее, мы используем команду ROW_COUNT() для проверки, было ли поле name изменено.

ROW_COUNT() возвращает количество строк, затронутых последней операцией UPDATE или DELETE. Если поле name не было изменено, то ни одна строка не будет затронута, и ROW_COUNT() вернет 0. Если поле name было изменено, то по крайней мере одна строка будет затронута, и ROW_COUNT() вернет 1 или больше.

Поэтому, в примере, мы проверяем, равен ли результат ROW_COUNT() 0. Если он равен 0, это означает, что поле name не было изменено, и мы откатываем транзакцию. Если он не равен 0, это означает, что поле name было изменено, и мы подтверждаем транзакцию.

Таким образом, мы проверяем, было ли поле name изменено, не сравнивая старое и новое значения явно, а просто проверяя, было ли затронуто хотя бы одна строка операцией UPDATE.
Что скажете?
0
Невнимательный
 Аватар для ft4l
2815 / 1191 / 354
Регистрация: 08.02.2013
Сообщений: 6,877
Записей в блоге: 2
26.01.2025, 11:10
Цитата Сообщение от gena8208 Посмотреть сообщение
Что скажете?
Сессии.
Когда для пользователя выполняется скрипт, который открыл сессию, файл сессии блокируется ,
и открытия сессии, с таким-же сид, ожидают разблокирования
... по завершению первого, или по выполнению из него session_write_close() или подобного .
Также частоту выполнения можно ограничить, сохранением и проверкой времени успешного выполнения,
касательно выполнения какого-либо действия конкретно.
0
Эксперт PHP
3897 / 3235 / 1353
Регистрация: 01.08.2012
Сообщений: 10,899
26.01.2025, 13:44
Цитата Сообщение от gena8208 Посмотреть сообщение
первая транзакция не прошла
Но новые записи добавились, значит транзакции прошли.

Цитата Сообщение от gena8208 Посмотреть сообщение
МОжет глупо конечно
Нормальное решение, чтобы юзер не мог спамить запросами. Только подозреваю, что проблему это не решит, т.к. есть подвисания, после которых могут начать выполняться сразу несколько запросов от разных операторов.

Цитата Сообщение от gena8208 Посмотреть сообщение
Что скажете?
ИИ предложил дичь. Проблема типовая и её решение тоже типовое - SELECT ... FOR UPDATE, благодаря чему транзакции будут отрабатывать поочерёдно, не перекрывая друг друга. Больше тут ничего не требуется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.01.2025, 13:44
Помогаю со студенческими работами здесь

транзакция
Помогите, пожалуйста. Нужен исходник программы с транзакциями, с точками сохранения и отката транзакции.

Транзакция
Здравствуйте. Какую можно придумать транзакцию для бд Кулинарная книга? Никак не могу придумать. Просто счетов нет, каких-либо...

Транзакция
Как можно реализовать такое? У меня есть два метода, первый допустим удаляет файл, а второй создаёт. Мне надо , чтобы если второй метод...

Транзакция
Все доброго времени суток. Друзья подскажите что такое транзакция и с чем её едят ?! Стал читать информацию, и понял что это очень...

Транзакция
Привет всем ! Есть база :D В ней есть основные документы. У этих основных документов есть документы-ответы (т.е. response). Эти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »