Почему Oceanbase нарушает атомность транзакции в этом повторяемом сценарии чтения, в то время как MySQL обрабатывает ее MySql

Форум по Mysql
Ответить Пред. темаСлед. тема
Anonymous
 Почему Oceanbase нарушает атомность транзакции в этом повторяемом сценарии чтения, в то время как MySQL обрабатывает ее

Сообщение Anonymous »

Я проверяю транзакционное поведение в издание сообщества Oceanbase Community V.4.3.4.0 при повторяемой изоляции чтения, и я столкнулся с тем, что кажется нарушением атомичности транзакций (от кислоты). The same logic behaves correctly in MySQL 8.4.
Environment
  • OS Version and CPU Arch(uname -a):
Linux node-49-52-27-33 3.10.0-1160.119.1.el7.x86_64 #1 Smp Tue 4 июня 14:43:51 UTC 2024 x86_64 x86_64 x86_64 GNU /Linux < /p>
< /blockquote>
  • ob> Версия (ld_library_path = ../lib: $ ld_library_path ./observer -v):

Код: Выделить всё

mysql> select version();
+------------------------------+
| version()                    |
+------------------------------+
| 5.7.25-OceanBase_CE-v4.3.4.0 |
+------------------------------+
1 row in set (0.00 sec)
< /code>
 шаги < /strong>
шаги для воспроизведения поведения: < /p>
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
create table table1(a int primary key, b int);
insert into table1(a, b) values(3, 3), (4, 4), (5, 5);


T1
T2
Result




begin;

ok



begin;
ok


обновление таблицы 1 Установка b = 10 Где a = 3; < /td>
< /td>
OK < /td>
< /tr>

< /td>
infer in in in table1 (9, 9, 9); /> ok < /td>
< /tr>

< /td>
Обновление таблица 1 Установка b = 8 Где a = 4; < /td>
ok < /td>
< /tr>

addate1 advate1> a> 5; < /td>
< /td>
ok < /td>
< /tr>

select * From table1, где a! = 1; < /td>
< /td>
ok < /td>
< /td>
ok < /td>
< /td>
ok < /td>
< /td>
ok < /td>
< /td>
ok < /td>
< /td>
ok />

commit;
ok


commit;

ok

< /tbody>
< /table> < /div>
Итак, окончательная последовательность выполнения -t2 -> t1 (T2 Commits сначала, T1 Commits после T2) < /p>
Вся рабочая нагрузка завершена,
Однако конечный результат в океане: < /p>

Код: Выделить всё

mysql> select * from table1;
+---+------+
| a | b    |
+---+------+
| 3 |   10 |
| 4 |    8 |
| 5 |    5 |
| 9 |    9 |
+---+------+
4 rows in set (0.00 sec)
But in MySQL 8.4, the final row for a = 9 is correctly updated to b = 11 (by T1’s second UPDATE) — because the engine ensures proper blocking/waiting to preserve transaction atomicity:
When T1 execute the second update, Mysql will waiting, until T2 commit;
mysql> update table1 set b = 11 where a > 5;
-- waiting
< /code>
и MySQL v8.4 Окончательный результат в следующем: < /p>
mysql> select * from table1;
+---+------+
| a | b |
+---+------+
| 3 | 10 |
| 4 | 8 |
| 5 | 5 |
| 9 | 11 |
+---+------+
4 rows in set (0.00 sec)
< /code>
Вопрос < /strong> < /p>

Почему Oceanbase позволяет второму обновлению T1, чтобы молча пропустить строку (9, 9), вставленную T2, даже если T2 совершает до T1? Разве это не против принципа кислоты? < /p>
< /blockquote>
Я проводил функциональное тестирование на Oceanbase, чтобы проверить его транзакционное поведение при повторяемой изоляции чтения. Во время теста я заметил, что одна транзакция (T1), казалось, пропустила ряд, вставленную другой транзакцией (T2), хотя T2 уже совершил до T1. В MySQL второе обновление в T1 правильно подождало, пока T2 выпустит блокировку, а конечный результат включал обновленное значение - сохранение атомации транзакций.>

Подробнее здесь: https://stackoverflow.com/questions/795 ... ad-scenari
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «MySql»