2014-09-26 3 views
1

Я использую базы данных SQLite с реализацией System.Data.Sqlite для .NET.SQLite Transactions и LastInsertRowID

Я вставляю записи в цикл в несколько таблиц (пример дается с двумя таблицами). Сначала я начинаю транзакцию, а затем вставляю одну запись в таблицу 1. Затем я принимаю connection.LastInsertRowID и вставляю запись вместе с этим значением (как внешний ключ) в таблицу 2.

Я делаю это для всех своих записей, а затем фиксирую перевод.

Почему это работает и мешает работе? Как узнать значение LastInsertRowID, если записи действительно не были введены из-за того, что транзакция еще не была выполнена? Нужно ли угадывать значение каждый раз с предыдущих шагов и тем самым снизить производительность?

+0

Не могу подтвердить прямо сейчас, но я подозреваю, что он выберет следующий номер и просто отбросит номер (т. Е. Оставит отверстие в последовательности), если транзакция отменяется. –

+0

Это плохо? Что делать, если записи удаляются в одной транзакции перед вставками? – Jens

ответ

2

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

Изменения, которые вы делаете, фактически записываются в таблицу в кеше страницы. Если переполнение кеша страницы, изменения записываются в файл базы данных (но с резервными копиями старых данных, чтобы можно было отменить транзакцию). Для получения более подробной информации см. Atomic Commit In SQLite.

+0

Я понимаю. Спасибо за ваш ответ. Интересные вещи :-) – Jens