SQLite Atomic - Транзакция, Hostinfo
Важна здравна характеристика за база данни като SQLite е атомният фиксиране, което може да се преведе като "кохерентна транзакция". Този термин означава, че или цялата база данни прави промяна в една транзакция, или изобщо не го прави. В една интегрална транзакция се правят много различни записи в различни секции от файла на базата данни - незабавно и едновременно. Действителният хардуер преобразува последователно записите в устройството с памет с голям капацитет и отнема ограничено време, за да напише един сектор. По този начин се оказва, че е невъзможно да се запишат много сектори във файл с база данни едновременно и/или моментално. Логиката на интегралната транзакция в SQLite обаче ни позволява да говорим за възможността за такъв процес, когато промените във файла на базата данни се извършват едновременно и почти моментално.
Разглежданият въпрос е доста обширен. За да разберете по-добре този процес, ще трябва да изброите много условия, предложени от разработчиците на SQLite. Например, за по-лесно разбиране в описанието, всички устройства за масово съхранение ще бъдат наричани „диск“, въпреки че устройството може да е обикновена флаш памет. Също така се приема, че дискът се състои от "части", които тук ще бъдат наричани сектори. Това означава, че ще бъде невъзможно да се промени частта от диска, която е по-малка от сектор. За да промените част от диска, която е по-малка от сектор, първо трябва да прочетете целия сектор, съдържащ частта, която трябва да промените, да направите промяната и след това да презапишете целия сектор.
На традиционните въртящи се дискове секторът е минимална единица, работеща в две посоки - четене и писане. В същото време във флаш паметта минималният размер на четимата памет е значително по-малък от минималния размер на записаната памет. За SQLite размерът на записаната област е с по-висок приоритет, следователно, когато се говори за „сектора“ в статията, това ще означава минималното количество данни, които могат да бъдат записани в паметта едновременно.
SQLite не приема, че секторният запис е интегрален. Предполага се обаче, че е линейна. Под "линейно писане" разработчиците имат предвид, че SQLite приема, че когато пише сектор, хардуерът започва в края на някои данни и пише байт по байт, докато стигне до другия край. Записът може да премине от началото до края или от края до началото. Ако по време на записването на сектор възникне прекъсване на електрозахранването, това може да означава, че част от сектора е променена, а другата част е останала непроменена. Ключовото предположение на SQLite е, че ако част от сектор е променен, тогава или първият, или последният байт в него също ще бъдат променени. И хардуерът никога няма да започне да записва сектор от средата до края. Разработчиците на SQLite не твърдят, че това винаги се случва, но според тях подобно твърдение изглежда разумно.
Предишният параграф гласи: SQLite не предполага, че даден сектор се пише незабавно и изцяло. Това е правилно по подразбиране. Започвайки с SQLite версия 3.5.0, библиотеката има нов интерфейс, наречен интерфейс на виртуалната файлова система. Виртуалната файлова система е единственото средство, чрез което SQLite комуникира с основната файлова система. Кодът по подразбиране за VFS е проектиран да работи с Unix и Windows. Съществува и механизъм за създаване на нов VFS по избор в движение. Интерфейсът на този нов VFS използва метод, наречен xDeviceCharacteristics. Този метод разследва основната файлова система, за да открие различните свойства и режими, които тя показва или не. Методът xDeviceCharacteristics може да покаже кои сектори могат да бъдат написани интегрално, да покаже дали не са и SQLite ще се опита да използва този факт в своя полза. По подразбиране обаче този метод не показва целостта на секторния запис както за Unix, така и за Windows наведнъж, поради което такива оптимизации обикновено се пропускат.