2014-01-02 4 views
1

Я пишу код, который импортирует большое количество данных в три таблицы, в настоящее время около 6 миллионов строк в трех таблицах. Я хочу сделать это в транзакции, поэтому, если есть какие-либо проблемы или пользователь отменяет импорт, импорт ничего не импортируется. Это отлично работает на моей машине развития, однако на более медленной Amazon EC2 экземпляра и микро SQL, например я получаю следующее исключение:System.Data.SqlClient.SqlException: Timeout expired on commit

System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding 

Теперь я знаю, что коммит заканчивает в конце концов, потому что данные присутствуют в таблицах когда я смотрю, так мой вопрос; можно ли это легко избежать, не добавляя свойство тайм-аута соединения к моей строке соединения (я хочу, чтобы эта одна операция не была таймаутом), или это действительно тяжелая/опасная вещь? Я не уверен, может быть, мне нужно импортировать в холдинг таблицы, а затем вызвать хранимые процедуры для перемещения данных, когда я буду готов, потому что я предполагаю, что это приведет к более короткой транзакции)

Я использую сервер Ms Sql 2012. Прокомментируйте, если мне нужно добавить дополнительные данные. Большое спасибо за помощь.

ответ

0

Проверьте, что такое тайм-аут получения SP. Если у вас есть сторонний инструмент, такой как Redgate или Avicode, вы можете понять это. Или использовать Profiler для его выяснения .. затем посмотреть выполнение план для SP или запроса. Если вы найдете поиск ключей или поиск RID, сначала разрешите его и повторите попытку.

+0

Я не совсем понимаю, что вы здесь говорите, хранимые процедуры и запросы, чтобы получить данные в таблицы не синхронизируются, и указанное выше исключение возникает, когда я вызываю метод commit в объекте транзакции. – user2647347