MySql: можно ли установить защиту данных между несколькими подключениями? - PullRequest
2 голосов
/ 11 января 2020

У меня есть несколько потоков, вставляющих строки в 2 таблицы, одну с внешним ключом (FK) и одну с первичным ключом (PK), используя F # SqlDataProvider. Каждая вставка получает свой собственный контекст данных (соединение).

Я проверяю, что вставляю в таблицу с PK и SubmitUpdates (), а затем и только тогда я создаю другой контекст (в другом потоке) для вставки данных в таблицу с FK.

По какой-то причине это имеет условие состязания: иногда транзакция завершается с ошибкой ограничения FK, даже если данные уже есть в базе данных, и я вижу в журнале, что SubmitUpdates () правильно вызывался за несколько миллисекунд до этого.

Я уверен, что SubmitUpdates () ожидает, пока база данных подтвердит успешное принятие транзакции, иначе ничего не будет работать. Однако, похоже, что даже если я создам новый контекст данных (соединение) после и попытаюсь зафиксировать зависимые строки в таблице с помощью FK, этот поток / соединение по какой-то причине не сразу видит данные, имеющие только что был успешно зафиксирован в другой ветке. Если я ограничу всю эту деятельность одним потоком, все будет работать.

Я что-то здесь упускаю? Какой способ диагностики такой проблемы?

[Редактировать] Похоже, что происходит задержка, когда данные фиксируются, прежде чем они будут доступны в другом потоке / соединении. Если я работаю в том же соединении (контекст данных) или если я просто жду 1 секунду и повторно отправляю свои запросы, когда они терпят неудачу (это случается не часто), они успешны. Я предполагаю, что мне придется принять тот факт, что несколько соединений, даже в рамках одного и того же процесса, не сериализуемы в том смысле, что я не могу поставить забор данных между двумя соединениями и убедиться, что соединение B всегда гарантирует, что все данные зафиксированы в соединении. A.

...