На основании того факта, что «использование datacontext» обеспечит закрытие текущей транзакции и соединения, я буду считать, что следующего блока должно быть достаточно:
01. using (DataContext db = new DataContext())
02. {
03. db.Connection.Open();
04. db.Transaction = db.Connection.BeginTransaction();
05.
06. foreach (string entry in entries)
07. {
08. XXX xxx = new XXX()
09. {
10. P1 = "something",
11. P2 = "something"
12. };
13. db.XXXX.InsertOnSubmit(xxx);
14. }
15. db.SubmitChanges();
16.
17. db.Transaction.Commit();
18. }
Если между строками 05 и 16 возникает исключение, транзакция никогда не будет помечена как Commit и будет отменена, как только транзакция и подключение завершатся в строке 18.
Примечание: здесь есть различие в поведении, которое, я не уверен, является преднамеренным или нет: в дополнение к откату транзакции ваш блок перехвата глотает исключение и таким образом скрывает факт возникновения ошибки.
Обновление: Я бы также переместил вызов SubmitChanges из внутреннего цикла. Сначала вы сможете выполнить вставки, а затем отправить изменения один раз для всех изменений.