Просто выстрел в темноте, но обязательно отмените / прекратите все запущенные транзакции.Я не знаком с MySQL C API, но думаю, что есть способ проверить наличие активных соединений / запросов.Возможно, вам не удастся закрыть сокет просто потому, что все еще выполняются какие-то вещи, и их нужно привести в какое-то «разрешенное» состояние, будь то зафиксированное или откатанное.Я бы начал там и посмотрел, что происходит.Вы действительно не хотите отключать стиль сокета "грубой силы", если у вас все равно есть что-то ожидающее, потому что ваши данные впоследствии не будут в надежном "состоянии" - вы не будете знать, какие транзакции были успешными, а какие - нет, хотя япредположил бы, что MySQL будет откатывать любые ожидающие транзакции, если соединение внезапно прервалось.
EDIT : Из того, что я нашел с помощью Googling «MySQL останавливает безудержный запрос», консенсус, похоже, заключается в том, чтобы спроситьMySQL для завершения потока убегающего / долго выполняющегося запроса с использованием
KILL thread-id
Я мог бы представить, что вам доступен идентификатор потока в структуре данных MySQL, содержащей сокет.Возможно, вы захотите попробовать это, хотя IIRC для этого требует привилегий суперпользователя.
EDIT # 2 : Очевидно, MySQL предоставляет отказоустойчивый механизм, который принудительно перезапускает закрытое соединение, поэтомувыключение сокета фактически не завершит запрос.Как только вы закроете его, MySQL откроет другой и попытается завершить запрос.Отключение этого параметра позволит вам закрыть сокет и заставить запрос завершиться.
В комментариях ниже показано, как был найден ответ, и процесс мышления в нем.