У меня возникла проблема, когда я использовал транзакцию раньше. Надеюсь, кто-то может помочь мне понять это. Буду признателен за любую помощь. Спасибо.В чем разница между использованием столбца с индексированным столбцом и неиндексированным столбцом для обновления данных из разных транзакций?
MySql структура таблицы:
create table test (
id int not null,
someid int,
name varchar(50),
update_date datetime
);
primary key : id (auto-inc)
index1 : id (unique)
index2 : id, update_date (non-unique)
метод Java:
// consider this method is Transaction 1
method1() {
A. set session transaction isolation level read commited;
B. select update_date from test where someid = 1;
C. insert into test values (some new data..);
D. select update_date from test where someid = 1;
}
// consider this method is Transaction 2
methodb() {
E. (start with default transaction isolation level - repeatable read)
F. update test set udpate_date = now() where someid = 1;
}
Вот что я сделал:
- выполнить method1() и перерыв (точка множества разрыва в затмении) при D
- выполнить метод2() одновременно
Обратите внимание, что «someid» не находится в индексе, но он сохраняет те же данные, что и «id».
Тогда у меня ничего нет, кроме как ждать, пока я не совершаю транзакцию1 или, в конце концов, это закончится таймаутом транзакции. Но если бы я изменил where clause на id = 1 F, он будет работать нормально, без каких-либо остановок. Здесь я запутался, потому что я не блокировал эту таблицу или любые строки. И если я это сделал, это не должно быть сделано, правильно?
Может ли кто-нибудь сказать мне, почему это произошло? Спасибо!
Благодарим вас за ответ! Имеет смысл, как обновление происходит, по крайней мере, я так думаю. Ну, я не знаком с транзакциями, но немного сложно верить, что уровень изоляции влияет на статус обновления, для меня по крайней мере :-) – redfoxlee
Кстати: похоже, уровень изоляции влияет на режим блокировки. Но в этом случае я не вижу различий между READ COMMITED и REPEATABLE READ. – redfoxlee