Environment
- OS Version and CPU Arch(uname -a):
< /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)
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