Я использую Loopback с PostgresSQL. Я проверил документы Loopback, но, похоже, нет инструкции для блокировки на уровне строк. Я пытаюсь использовать транзакцию, как это:
Процесс Начать транзакцию, выбрать сделку с этой транзакцией, затем подождать 10 секунд. Таким образом, он должен заблокировать эту строку через 10 секунд.
Процесс B запускается через 2 секунды после процесса A, также начинайте транзакцию и выбирайте ту же сделку.
Я ожидаю, что процесс B не сможет выбрать эту строку до истечения 10 секунд, но может.
Рассмотрим этот сценарий:
const wait = s => new Promise(resolve => setTimeout(resolve, s * 1000));
async function test(id, processName) {
const { Trade } = app.models;
const transaction = await Trade.beginTransaction({});
console.log(`Process ${processName} - start`);
const trade = await Trade.findOne({ where: { id }, transaction });
if (trade) {
console.log(`Process ${processName} - trade found`);
}
await wait(10);
transaction.commit();
console.log(`Process ${processName} - finished`);
}
test('1809004512', 'A');
// Wait 2 seconds before calling process B
wait(2).then(() => test('1809004512', 'B'));
Вот лог:
Process A - start
Process A - trade found
// 2 seconds waiting
Process B - start
Process B - trade found
// 8 seconds waiting
Process A - finished
Process B - finished
Я ожидаю, что если строка заблокирована в правильном направлении, Process B - trade found
должно быть напечатано после Process A - finished
Что мне делать? Пожалуйста, помогите