Удалить незафиксированную вставленную строку в DB2 (V8.2.7 - Fix 14)
По запросу клиента меня попросили включить веб-приложение на уровень изоляции без чтения (вероятно, это плохая идея...).
Во время тестирования, если изоляция была на месте, я вставил строку без фиксации (DBVisualiser: @set autocommit off + stop VPN-подключение к базе данных) и начал тестировать свое приложение в отношении этой незафиксированной вставки.
выберите * из MYTABLE, ГДЕ МОЙ ID = "NON_COMMIT_INSERT_ID" С UR работает нормально. Теперь я хотел бы "удалить" эту строку, и я не нашел пути...
ОБНОВЛЕНИЕ: ряд действительно исчез через некоторое время (около 30 минут). Я предполагаю, что есть некоторый тайм-аут, прежде чем откат будет произведен автоматически Есть ли способ удалить незафиксированные строки, прежде чем это произойдет?
2 ответа
Я думаю, что это будет невозможно при использовании обычных операторов SQL - единственный способ удалить строку - откатить транзакцию, которая ее вставила (или подождать, пока tx подтвердит, а затем удалить). Поскольку вы отключились от БД на сетевом уровне, то 30 минут, о которых вы говорите, - это, вероятно, тайм-аут TCP на уровне операционной системы. После того, как TCP-соединение было разорвано, DB2 автоматически откатила транзакцию клиента.
Тем не менее, я думаю, что вы могли бы административно принудительно отключить приложение от базы данных (используя FORCE APPLICATION с дескриптором, полученным из LIST APPLICATIONS), что должно откатить транзакцию, см. http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/core/r0001951.htm для получения подробной информации об этих командах.
Одно дело - читать незафиксированные строки из базы данных. Иногда для этого есть веские причины (отсутствие блокировки чтения),
Другой способ оставить вставленные, обновленные или удаленные строки в базе данных без фиксации или отката. Вы никогда не должны делать это. Либо зафиксировать, либо выполнить откат после изменения базы данных.