Является ли LAST_INSERT_ID () в транзакции надежным? - PullRequest
7 голосов
/ 15 сентября 2011

Я использую mysql / ado.net / C # вот моя проблема. Я знаю, что mysql работает одновременно, однако у меня есть данные файла (имя большого пальца) и данные базы данных (строка) для синхронизации.

Если я начну транзакцию, и она по какой-либо причине не получится, это будет проблемой?Если у меня этот код будет запущен одновременно на двух ядрах, будут ли они дублировать друг друга?По сути, мне нужно знать, если 1) last_insert_id зависит от не меняется.2) если одна транзакция использует указанный rowid, то другая транзакция не будет его использовать.

start transaction
insert statement, however i dont want it to be active yet;
select LAST_INSERT_ID()
File.Delete(lastid)//may exist from a transaction that failed
File.Move(thumbImage, lastid)
transaction.commit()//ok done

Безопасно ли это?Почему или почему нет?

1 Ответ

28 голосов
/ 15 сентября 2011

Функция MySQL last_insert_id () является надежной в том смысле, что она всегда является последней вставкой, выполняемой посредством данного соединения.Он не будет сообщать идентификатор вставки, созданный каким-либо другим соединением, он не будет сообщать о вставке, которую вы сделали два соединения назад.Не имеет значения, на каком ядре процессора произошла фактическая вставка, и на каком ядре обрабатывается вызов last_insert_id ().Это всегда будет правильный идентификационный номер для этого соединения.

Если откатить транзакцию, которая выполнила вставку, last_insert_id () ОСТАЕТСЯ сообщать об этом новом идентификаторе, даже если он больше не существует.Однако идентификатор не будет использоваться повторно при последующей вставке

...