2016-09-19 3 views
0

Привет всем Ниже приведен сценарий проблема:транзакции и блокировки с несколькими потоками

Я использую MYSQL (Innodb двигателя), один из моего приложения (C++/MYSQLCAPI) делает следующие операции:

СНВ СДЕЛКА

усеченного my_table

нагрузка входной_файла данных в таблице my_table.

если оба выше команда [усечь и нагрузку] является успешной, то COMMIT

еще ROLLBACK

теперь другое приложение (С ++/MYSQLCAPI), который читает эту таблицу в каждой секунде следующая команда.

выберите * из my_table

ОШИБКИ: в этом прочитало попытку когда-то он получает 0 данных, что может быть причиной этого?

+0

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

+0

нет, приложение-считыватель не блокирует. – birubisht

ответ

1
CREATE TABLE new LIKE real; 
load `new` by whatever means 
if something went wrong, don't do the next two steps. 
RENAME TABLE real TO old, new TO real; 
DROP TABLE old; 

Это позволяет избежать проблем, вы упомянули, а также множество других проблем. В частности, он не требует специальной обработки транзакций; RENAME является атомарным и очень быстрым.

1

Вы видите пустой стол с truncate table has an implicit commit. Если вам необходимо изменить всю таблицу в транзакции вы можете использовать удалить, а затем вставить, или попробуйте переименовать Раствор presented in this answer

+0

Большое спасибо Broadbent за эту информацию. Я собираюсь реализовать это решение сейчас. – birubisht

 Смежные вопросы

  • Нет связанных вопросов^_^