Я хочу обновить счет статистики в mysql.Проблемы с блокировкой Mysql Innodb на REPLACE INTO
SQL, выглядит следующим образом:
REPLACE INTO `record_amount`(`source`,`owner`,`day_time`,`count`) VALUES (?,?,?,?)
Схема:
CREATE TABLE `record_amount` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`owner` varchar(50) NOT NULL ,
`source` varchar(50) NOT NULL ,
`day_time` varchar(10) NOT NULL,
`count` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `src_time` (`owner`,`source`,`day_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Однако это вызвало исключение тупиком в мульти-процессов работает (т.е. Map-Reduce).
Я прочитал некоторые материалы в Интернете и смущен этими замками. Я знаю, что innodb использует блокировку на уровне строк. Я могу просто использовать табличный замок для решения бизнес-задачи, но это немного экстремально. Я нашел несколько возможных решений:
- изменения
REPLACE INTO
в сделку сSELECT id FOR UPDATE
иUPDATE
- изменения
REPLACE INTO
вINSERT ... ON DUPLICATE KEY UPDATE
Я понятия не имею, что которая является практичным и лучше. Может кто-нибудь объяснить это или предложить некоторые ссылки для меня, чтобы читать и учиться? Спасибо!
просто используйте myisam для этого стола, он не содержит замки. – Sebas
@Sebas Спасибо. И я помню, что myisam использует блокировку на уровне таблицы, что, если я просто заблокирую таблицу в Innodb? Изменение sql-схемы не является первым выбором, поскольку я должен убедить DBA. – Lhfcws
Я должен был быть более точным.Он содержит блокировки, но без транзакций, поэтому нет взаимоблокировок - что кажется вашей проблемой. О вещи дба, ты прав, я думаю. Однако таблицы журналов, таблицы подсчета и т. Д. Являются типичной реализацией myisam, вложенной в базу данных innodb. – Sebas