Я пытаюсь полностью понять идею транзакций. Поэтому следующий вопрос ... (конечно, новичок, так что не смейтесь: D)
Я установил (упрощенную) транзакцию в PHP (используя драйвер PHP PHP от Microsoft). Я хочу получить строки, которые собираюсь удалить, для дополнительной обработки позже:
sqlsrv_begin_transaction($conn);
$sql = "SELECT * FROM test WITH (XLOCK) WHERE a<10";
$statement = sqlsrv_query($conn,$sql);
$sql = "DELETE FROM test WHERE a<10";
sqlsrv_query($conn,$sql);
$result = get_result_array($statement);
sqlsrv_commit($conn);
$result2 = get_result_array($statement);
1) Я получаю ожидаемый результат в $ result, но пустой массив в $ result2. Почему?
Я бы ожидал только результат в $ result2, потому что тогда транзакция фактически была выполнена. Я предполагаю, что результат в $ result является своего рода «временным» результатом в памяти, а не результатом реальной базы данных.
2) Возможно, что между моментом запуска транзакции и фактической фиксацией другой запрос из другого соединения изменил соответствующие строки (a <10)? Это означает, что ожидаемые результаты в соответствии с $ result будут отличаться от реальных изменений в базе данных. </p>
Или (а) транзакция происходит с копией базы данных в памяти (на которую не влияют промежуточные запросы из других соединений), или (б) блокировки, полученные с начала транзакции, уже в действии для других запросов из других соединений?
После ввода этого сообщения я ожидаю ответа b ....?