Используя базу данных H2 1.4, я могу писать новые строки, если читаю другие строки - PullRequest
3 голосов
/ 14 июня 2019

Используя базу данных H2 1.4, могу ли я писать новые строки, читая другие строки?

т. Е. Если в таблице 1000 строк и выполняется запрос SELECT, который получает первичный ключ 1-10, можно ли в запросе INSERT вставить несколько новых строк одновременно или нужно будет ждать ( все) запрос SELECT на эту таблицу, чтобы закончить?

Какова ситуация с ОБНОВЛЕНИЕМ строк в табличной таблице, но не получаемых никаким запросом SELECT?

Я спрашиваю, потому что с H2 1.3 я заметил, что потоки моего приложения, которые обращались к базе данных, казалось, тратят много времени на блокировку, кажется, теперь лучше, когда я обновился до 1.4. Но в моем многопоточном приложении потоки всегда работают с разными строками, поэтому для меня важно лучше понять, как работает блокировка в H2 (с хранилищем MV, ранее использовалось хранилище PAGE с 1.3), и может ли H2 просто блокировать отдельные строки при обновлении или если нужно заблокировать всю таблицу.

1 Ответ

0 голосов
/ 26 июля 2019

Это зависит от выбранного вами механизма хранения.Вся информация ниже относится к самой последней версии (1.4.199), старые версии имеют некоторые отличия.

  • Со стандартными операциями модификации данных движка MVStore и SELECT … FOR UPDATE измененной блокировкой (или выбранной)строк.Другие транзакции не могут изменять заблокированные строки параллельно, но могут читать их значения.Обратите внимание, что уровень изоляции для чтения используется по умолчанию, а другие уровни изоляции не поддерживаются этим механизмом.При уровне изоляции зафиксированного чтения другие транзакции не будут видеть одновременно измененные значения, они будут видеть старые.Новые значения будут видны только тогда, когда эта транзакция завершит свою работу.С этим механизмом база данных по умолчанию работает в многопоточном режиме, поэтому длительная команда не будет блокировать другие сеансы.

  • С устаревшим механизмом PageStore (добавьте ;MV_STORE=FALSE к URL-адресу соединенияесли вы хотите создать базу данных с этим механизмом), все таблицы заблокированы для записи.Это означает, что вам действительно нужно блокировать таблицы в одном и том же порядке (алфавитном или каком-либо другом) во всех ваших транзакциях, иначе возможна тупиковая ситуация.С этой базой данных движка по умолчанию работает в однопоточном режиме, вы можете явно включить многопоточный режим, но это не безопасно с этим движком.Различные сеансы не могут выполнять свою работу одновременно, длительная команда блокирует все остальные сеансы.

Базы данных не преобразуются из старого (PageStore) формата в новый (MVStore) формат, когдавы открываете их с новой версией H2, вы должны сделать это самостоятельно.Также старые базы данных могут иметь серьезные проблемы с новыми версиями, рекомендуется экспортировать их в SQL со старой версией H2, используя команду SCRIPT TO 'filename.sql', и загрузить этот скрипт в новую базу данных с новой версией H2, используя команду RUNSCRIPT FROM 'filename.sql'.Вы должны сделать это, даже если вы решите использовать старый двигатель.Если у вас есть постоянные базы данных, не забудьте создать обычные резервные копии (например, с помощью команды BACKUP TO 'filename.zip').

Более подробную информацию можно найти в документации:

https://h2database.com/html/advanced.html#mvcc

https://h2database.com/html/features.html#multiple_connections

...