2015-06-16 3 views
0

Что произойдет, если я вызову Thread.Abort() (в C# /. NET) в потоке, который в настоящее время выполняет команду ODBC (в частности, против MSSQL и Oracle, но также и вообще)? Будет ли отменена команда? Будет ли сервер БД распознавать, что на другом конце соединения нет ничего и убить процесс (опять же, в частности, MSSQL и Oracle)? Или мне нужно явно позвонить Cancel() по соединению в первую очередь?C# Thread.Abort() + ODBC Connection

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

Я хотел бы запрограммировать защиту и попытаться выпустить Cancel(), если это вообще возможно, но я все равно хотел бы знать поведение.

+1

Я думаю, что вам нужно называть отмену –

+1

'Thread.Abort()' должен работать только тогда, когда управляемый код управляется ... так что на самом деле это зависит от того, как создается драйвер, если это управляемый код или он неуправляемый код. Если драйвер неуправляемого кода, он невосприимчив к 'Thread.Abort()' (см., Например, http://stackoverflow.com/q/2781484/613130) – xanatos

+0

См. Например http://stackoverflow.com/q/ 1401532/613130 ​​для лиц, которые пытались «Thread.Abort()' vs 'SqlDataAdapter' (подсказка:' SqlDataAdapter' won :-)) – xanatos

ответ

0

Если вы хотите отменить команду SQL, почему бы не использовать метод TransactionScope.Dispose() или просто не сделать Complete транзакцию? Он работает выше Thread, Process и таких абстракций, и не будет никаких рас между Thread отменой и командой SQL.

Кроме того, как было указано в комментариях, драйвер SQL может работать в других Thread и даже может быть неуправляемым кодом, так что информация аннулирует Thread не будет влиять на команду SQL, и вам действительно нужно Cancel() соединение или команду ,