Разница между уровнями изоляции в блокируемой реализации - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь реализовать блокировку таблиц в базе данных с помощью c ++ и mysql.Я использую эталонные тесты tpc-a, в которых я имитирую базу данных мини-банка и запускаю на ней кучу потоков, и каждый поток выполняет 10 транзакций одновременно, и цель состоит в том, чтобы поддерживать согласованность после того, как все транзакции закончили свою работу.Вот фрагмент кода, который является частью цикла for, который каждый поток запускает 10 раз:

g_lockTableAccount->lockRecord(hashInt(randomAccountNumSource, g_numAccount), randomAccountNumSource, GetCurrentThread());
startTransaction(conn);
//get first account balance and branch.
{

    std::string query = "SELECT account_balance,branch_ID from `account` WHERE account_ID = " + std::to_string(randomAccountNumSource) + ";";
    executeQuery(conn, query);
    MYSQL_RES * res = mysql_use_result(conn);
    MYSQL_ROW row = mysql_fetch_row(res);

    sourceAccountBalance = toInt(row[0]);
    sourceAccountBranch = toInt(row[1]);
    mysql_free_result(res);

}
//--------------------------------------------------------------------
sourceAccountBalance -= amount;
{
    std::string query = "UPDATE `Account` SET account_balance = '" +
        std::to_string(sourceAccountBalance) + "' where account_ID = " + std::to_string(randomAccountNumSource) + ";";
    executeQuery(conn, query);

}
//--------------------------------------------------------------------
commitTransaction(conn);
g_lockTableAccount->unlockRecord(hashInt(randomAccountNumSource, g_numAccount), randomAccountNumSource);

Я блокирую и разблокирую другие записи с тем же шаблоном.но я чувствую, что с этим что-то не так, потому что я думаю, что шаблон запуска команды sql и ее фиксации неверен, но проблема в том, что когда я запускаю транзакцию в начале цикла for и фиксирую в конце, этот шаблон вызывает взаимоблокировки, потому чтона любом уровне изоляции база данных не снимет полученные блокировки.Как я могу сделать это правильно и без тупиков?есть ли вообще?как различные уровни изоляции влияют на эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...