Я пытаюсь реализовать блокировку таблиц в базе данных с помощью 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 и фиксирую в конце, этот шаблон вызывает взаимоблокировки, потому чтона любом уровне изоляции база данных не снимет полученные блокировки.Как я могу сделать это правильно и без тупиков?есть ли вообще?как различные уровни изоляции влияют на эту проблему?