Использование транзакций при вставке записей в базу данных с C # - PullRequest
1 голос
/ 24 апреля 2011

Я никогда не использовал транзакции SQL, и в моем случае я знаю, что мне действительно придется их использовать. Одной из функций моего приложения является преобразование файла Excel в базу данных.

Таким образом, я получаю значения из Excel, создаю массив строк с аргументами (для отправки в SP) и некоторые значения, которые я вставлю непосредственно в основную таблицу, а другие я вставлю во вторичные таблицы. , а затем я получу идентификаторы, которые будут вместо этих значений в основной таблице. Я говорю, что у меня есть внешние ключи, и поэтому я делаю это.

Так что я думаю, что делаю это отлично, но без транзакций. Но если что-то пойдет не так, когда я вставляю значения в таблицы, мне придется выполнить откат.

Итак, в процессе я использую 5 хранимых процедур, по одной для каждой таблицы. Эти SP не являются исключительными для этого процесса. Они будут использоваться в приложении для вставки записей.

Но мне нужна помощь в том, где использовать транзакцию. Должен ли я сделать это в C # (на стороне приложения) или в SQL Server (на стороне сервера)?

Пока я использую объект SqlTransaction из C #, и он работает каким-то образом, потому что, если я сделаю откат, он действительно отменяет все вставки, но идентификаторы, которые я использовал в транзакции, больше не доступны. Только если я отброшу все таблицы и создам их снова, эти идентификаторы снова будут доступны.

Так что я думаю, что я плохо использую транзакцию, и поэтому мне нужна помощь, чтобы знать, как и где лучше использовать транзакцию.

Ответы [ 2 ]

3 голосов
/ 24 апреля 2011

Я думаю, что вы на правильном пути в том, как вы используете транзакции, проблема в том, что начальное число для столбцов IDENTITY не откатывается.

Я предполагаю, что вы используете MS SQL Server?Чтобы сбросить столбцы IDENTITY без воссоздания таблиц, вы можете использовать DBCC CHECKIDENT.

DBCC CHECKIDENT (table_name, RESEED, 99);

Это приведет к сбросу начального числа, так что следующее назначенное значение идентификатора будет 100. Вы, конечно, должны записать самый высокий идентификаторзначение для таблицы до начала транзакции.

Я бы использовал это, только если есть один процесс записи.В ситуации с несколькими авторами, это может привести к тому, что все пойдет не так, если вы сначала не сделаете серьезную блокировку таблицы.В случае нескольких авторов, я думаю, что вам гораздо лучше написать остальную часть кода, так что «дыры» в значениях столбца идентификаторов являются приемлемыми.

0 голосов
/ 25 апреля 2011

Если вы не используете столбец Identity для каких-либо других целей и не требуете, чтобы он был последовательным, попробуйте привыкнуть к мысли, что в нем будут «пропущенные» значения. Они на самом деле не пропали, так как они просто предоставляют способ дать каждой записи дешевый уникальный ключ. Вы также получите пробелы при удалении записи, и поэтому не должны зависеть от столбца Identity как счетчика записей.

Нам приятно видеть последовательные числа, когда мы смотрим на таблицу, но это дополнительная работа для вас и механизма базы данных. Мне потребовались месяцы, чтобы принять это.

Причина, по которой значение не используется повторно, состоит в том, чтобы помочь обеспечить целостность базы данных, когда этот столбец используется в качестве внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...