Deadlock, Database is locked

SQLITE_BUSY

W artykule SQLite jako baza danych tranformacji Pentaho opisywaliśmy jak użyteczna jest to baza danych. Minmalistyczna, wszystko zawarte w jednym pliku, bardzo szybka. Ale baza ta potrafi miec czkawki przy wiekszej ilosci danych. Nawet jeśli program który jej używa zamyka połączenia (Pentaho robi to domyślnie), sama baza jest nadal zajęta sobą i nie reaguje na czas. Żadne żonglowanie ilością sesji, ilością połączeń tutaj nie pomoże. W efekcie wywołanie następnego połączenia do tabeli/bazy powoduje komunikat SQLException: [SQLITE_BUSY] The database file is locked (database is locked)... lub podobny.

Zauważyć to można np. przy kasowaniu dużej ilości danych z tabeli. Zatem należy unikać takich operacji jeśli mamy wiele rekordów w tabeli (dziesiątki, setki tysięcy...). Co prawda baza SQLite przy wykonywaniu DELETE FROM table używa "TRUNCATE optimizera" ale rezultat jest kiepski. Rozwiązaniem może być użycie DROP TABLE i utworzenie tabeli na nowo.

Dodatkowe zalecenie to większe odstępy czasowe między komendami które wykonują operacje na bazie danych.

MySQL - Deadlock found

MySQL chociaż znacznie bardziej wydajna niż SQLite także potrafi zgłosić Deadlock found when trying to get lock; try restarting transaction. Zdarza się to np. przy wykonywaniu DELETE FROM table przy setkach tysięcy rekordów lub więcej.

W zestawie komend MySQL mamy TRUNCATE TABLE ktorą to komendą usuwamy zawartość nie kasując struktury tabeli (DROP tylko danych). Takie usunięcie danych jest znacznie szybsze niż DELETE FROM i może być rozwiązaniem lock'ow tabel.