Acid это: Требования ACID на простом языке / Хабр
Требования ACID на простом языке / Хабр
Мне нравятся книги из серии Head First O`Reilly — они рассказывают просто о сложном. И я стараюсь делать также.
Когда речь идёт о базах данных, могут всплыть магические слова «Требования ACID». На собеседовании или в разговоре разработчиков — не суть. В этой статье я расскажу о том, что это такое, как расшифровывается ACID и что означает каждая буква.
Требования ACID — набор требований, которые обеспечивают сохранность ваших данных. Что особенно важно для финансовых операций. Мы же не хотим остаться без денег из-за разрыва соединения или ошибки в ПО, не так ли?
См также:
Что такое транзакция
Что такое База Данных (БД)
Давайте пройдемся по каждой букве ACID и посмотрим на примерах, чем архив лучше 10 разных файлов. И чем транзакция лучше 10 отдельных запросов.
Atomicity — Атомарность
Consistency — Согласованность
Isolation — Изолированность
Durability — Надёжность
Atomicity — Атомарность
Атомарность гарантирует, что каждая транзакция будет выполнена полностью или не будет выполнена совсем. Не допускаются промежуточные состояния.
Друг познается в беде, а база данных — в работе с ошибками. О, если бы всё всегда было хорошо и без ошибок! Тогда бы никакие ACID были бы не нужны. Но как только возникает ошибка, атомарность становится очень важна.
Допустим, вы решили отправить маме деньги. Когда вы делаете перевод внутри банка, что происходит:
У вас деньги списались
Маме поступили
И допустим, что у нас 2 отдельных запроса. А теперь посмотрим, что будет при возникновении ошибок:
1. У вас на балансе нет нужной суммы — система вывела сообщение об ошибке, но катастрофы не произошло, атомарность тут не нужна.
2. У мамы заблокирована карточка, истек срок годности — деньги ей не поступили. Запрос отменен. Но минуточку… У вас то они уже списались!
Ошибка на первом этапе никаких проблем в себе не таит. А вот ошибка на втором… Приводит к потере денег, что явно недопустимо.
Если мы отправляем отдельные запросы, система не может связать их между собой. Запрос упал с ошибкой? Система его отменяет. Но только его, ведь она не знает о том, что запрос «у меня деньги спиши» связан с упавшим «сюда положи»!
Транзакция же позволяет сгруппировать запросы, то есть фактически показывает базе на взаимосвязи между ними. База сама о связях ничего не знает! Это знаете только вы =)
И если падает запрос внутри транзакции, база откатывает всю транзакцию. И приходит в состояние «как было до начала транзакции». Даже если там внутри было 10 запросов, вы можете спать спокойно — сломался один, откатятся все.
Consistency — Согласованность
Транзакция, достигающая своего нормального завершения (EOT — end of transaction, завершение транзакции) и, тем самым, фиксирующая свои результаты, сохраняет согласованность базы данных. Другими словами, каждая успешная транзакция по определению фиксирует только допустимые результаты wikipedia
Это свойство вытекает из предыдущего. Благодаря тому, что транзакция не допускает промежуточных результатов, база остается консистентной. Есть такое определение транзакции: «Упорядоченное множество операций, переводящих базу данных из одного согласованного состояния в другое». То есть до выполнения операции и после база остается консистентной (в переводе на русский — согласованной).
Например, пользователь в системе заполняет карточку:
В базе данных у нас есть несколько таблиц:
client
phone
address
Так что когда пользователь заполнил форму и нажал «сохранить», система отправляет в базу данных 3 запроса:
insert into client… -- вставить в таблицу клиентов такие-то данные insert into phone… insert into address…
Можно отправить 3 разных запроса, но лучше сделать одну транзакцию, внутри которой будут эти 3 запроса.
Атомарность гарантирует, что не получится такого, что адрес с телефоном сохранились, а сам клиент — нет. Это сделало бы базу неконсистентной, ведь у нас бы появились атрибуты, «висящие в воздухе», никому не принадлежащие. Что, в свою очередь, приведет к ошибкам в системе.
За консистентностью должен следить разработчик. Ведь это вопрос скорее бизнес-логики, чем технологий. Те же атрибуты, «висящие в воздухе» — это разработчик знает, что:
База об этом не знает ничего, если ей не рассказать. И она легко пропустит запрос «добавь в базу телефон без ссылки на клиента», если сам по себе запрос корректный, а разработчик не повесил на таблицу foreign key.
Можно повесить на таблицу constraint. Например, «баланс строго положительный». Тогда сценарий с ошибкой будет выглядеть так:
1. Пользователь пытается перевести другу 100р, хотя у него самого 10
2. Система отправляет в базу запрос — «обнови баланс карты, теперь там X – 100».
3. База пытается выполнить запрос, но ой! Нарушен constraint, в итоге операции баланс стал отрицательным, эту ошибку она и возвращает.
4. Система обрабатывает ошибку и выводит ее пользователю в читаемом виде.
К сожалению, нет единого механизма рассказать базе о том, какое состояние считается согласованным. Разработчик может использовать foreign ключи, какие-то констрейнты — это БД проверит. Но что с одного счета списалось, а на другой пришло — это БД уже не проверит. Это бизнес-логика.
Разработчик пишет код, пошагово переводящий БД в нужное согласованное состояние и, если где-то посередине возникает ошибка или нежданчик, откатывает всю транзакцию. То есть можно после каждого шага делать запрос, проверяя какое-то поле:
— Эй, баланс, ты ведь положительный остался?
— Ку-ку, тебе деньги пришли?
Если вдруг проверка не прошла, то кидаем ошибку и делаем откат.
Isolation — Изолированность
Во время выполнения транзакции параллельные транзакции не должны оказывать влияния на её результат.
Если у нас система строго для одного человека, проблем не будет. А если пользователей несколько? Тогда транзакции запускают в параллель — для ускорения работы системы. А иначе представьте себе, что вы делаете заказ в интернет-магазине и система вам говорит: «Вы в очереди, перед вами еще 100 человек хотят заказ оформить, подождите». Бред же? Бред!
Вот и приходится распараллеливать запросы. Но к каким эффектам может привести параллельная работа двух транзакций?
1 эффект: «Потерянная запись»
Есть некий счет А, на котором лежит 500 у.е.
Кассир 1 (К1 на рисунке) списал с него 300 у.е. Обозначим его действия рыжими стрелками. Списал 300, на выходе получает 200 = 500 — 300.
Кассир 2 (К2) тоже решил обратиться к этому же счету, и записал туда 300 у.е., пока К1 еще не успел закрыть свою транзакцию. Так как первая транзакция не закрыта, сумма на счете до сих пор 500, получаем 500 + 300 = 800.
Итог — мы «потеряли запись» первого кассира, ведь на выходе у нас А = 800, хотя должно быть 500. «Кто последний вписал результат — того и тапки». Получается так.
2 эффект: «Грязное чтение»
Есть некий счет А, на котором лежит 500 у.е.
Кассир 1 списал с него 300 у.е. Обозначим его действия рыжими стрелками. Списал 300. Потом передумал и сделал откат — на выходе остались те же 500 у. е.
Кассиру 2 (К2) понадобилась информация по этому счету и он ее считал до того, как К1 закрыл свою транзакцию.
Итог — второй кассир считал неверную сумму, построил неверный отчет/отказал в визе платежеспособному гражданину и т.д.
3 эффект: «Повторимое чтение»
Есть некие данные.
Кассир 1 строит отчет. Операции идут последовательно для каждой колонки. Система считала данные, записала в первую колонку (например, взяв минимум от них).
Обозначим получение данных зеленым цветом, а изменение — рыжим.
Кассир 2 влез в эту таблицу данных и изменил некоторые счета в ней.
У кассира 1 продолжается построение отчета. И во вторую колонку система считывает уже новые данные.
Итог — отчет построен на основании разных данных.
4 эффект: «Фантомы»
Есть некие данные.
Кассир 1 строит отчет. Операции идут последовательно для каждой колонки. Система считала данные, записала в первую колонку (например, взяв минимум от них).
Обозначим получение данных зеленым цветом, а изменение — рыжим.
Кассир 2 влез в эту таблицу данных и добавил новые счета/удалил некоторые старые.
У кассира 1 продолжается построение отчета. И во вторую колонку система считывает уже новые данные.
Итог — отчет построен на основании разных данных.
Разница между 3-им и 4-ым эффектами в том, что в одном случае данные изменяются, а во втором — добавляются/удаляются. То есть меняется ещё и их количество.
Как бороться
Как бороться с этими проблемами? Нужно изолировать транзакцию. Способов есть несколько, но основные — блокировки и версии.
Блокировки — это когда мы блокируем данные в базе. Можно заблокировать одну строку в таблице, а можно всю таблицу. Можно заблокировать данные на редактирование, а можно и на чтение тоже.
Подробнее о блокировках можно почитать тут:
Блокировка (СУБД) — статья из вики
Режимы блокировки — здесь хорошо описано, в чем отличие эксклюзивной от разделямой блокировки
Transaction Isolation Levels in DBMS — статья на английском, но хорошо прошлись по разным уровням изоляции базы
Версии — это когда внутри базы при каждом обновлении создается новая версия данных и сохраняется старая. Версионирование скрыто от разработчика, то есть мы не видим в базе никаких номеров версий и данных по ним. Просто пока транзакция, обновляющая запись, не покомитит свое изменение, остальные потребители читают старую версию записи и не блокируются.
Durability — Надёжность
Если пользователь получил подтверждение от системы, что транзакция выполнена, он может быть уверен, что сделанные им изменения не будут отменены из-за какого-либо сбоя. Обесточилась система, произошел сбой в оборудовании? На выполненную транзакцию это не повлияет.
См также:
ACID в википедии
Транзакции, ACID, CAP — статья с geekbrains
Разбираем ACID по буквам в NoSQL — а это с Хабра
Ну и напомню ссылку на статьи «Что такое транзакция» и «Что такое База Данных (БД)».
P.S. — больше полезных статей ищите в моем блоге по метке «полезное». А полезные видео — на моем youtube-канале
Что такое ACID в базах данных?
В базах данных (далее БД, СУБД), ACID (Atomicity — атомарность, consistency — консистентность, isolation — изолированность, durability — стойкость) это стандартный набор свойств, которые гарантируют, надежность транзакции.
В частности, ACID имеет отношение к тому, как БД может восстанавливаться после ошибок, возникающих в процессе выполнения транзакции.
В базах данных, следующих принципу ACID, данные остаются целостными и консистентными, несмотря на любые ошибки.
Определение ACID
ACID это аббревиатура, означающая Atomicity — атомарность, Consistency — консистентность, Isolation — изолированность, Durability — стойкость. Расшифровка каждого понятия будет дана ниже.
Atomicity (атомарность)
Атомарность гарантирует, что каждый запрос в транзакции будет выполнен успешно, либо вообще никакой, в случае ошибки одного. Не получится так, что часть запросов выполнятся успешно, а часть с ошибкой. Если хоть одна часть транзакции выполнится с ошибкой, вся транзакция не выполнится. Другими словами под атомарностью можно понимать «всё или ничего».
Consistency (консистентность, согласованность)
Это свойство даёт гарантию того, что все данные будут целостны. Данные будут корректны в соотвествии со всеми предопределёнными правилами, ограничениями, каскадами и триггерами, применёнными к БД.
Isolation (изолированность)
Гарантирует, что все транзакции будут выполняться изолированно. Ни одна транзакция не зааффектит на другую транзакцию. Другими словами, одна транзакция не сможет прочитать данные второй транзакции, которая ещё не выполнилась.
Durability (стойкость)
Durability означает, что когда транзакция будет применена, она останется в системе, даже если БД упала сразу после выполнения этой транзакции. Любые изменения, внесённые транзакцией, должны оставаться навсегда. Если БД сообщила об успешном выполнении транзакции, то она должна быть действительно применена.
Когда пригодится ACID?
Свойства ACID спроектированы для transaction-ориентированные баз данных.
ACID предлагает принципы, которым должны придерживаться базы данных, чтобы быть уверенным в том, что данные не будут повреждены в результате какой нибудь ошибки.
Транзакция это единая логическая операция, которая может состоять из одного или нескольких шагов. Например, транзакцией может быть перевод денежных средств между банковскими аккаунтами (снятие денег из одного и пополнение другого). Если в середине такой транзакции возникнет ошибка, может возникнуть большая неконсистентность в данных. Деньги будут вычтены с одного счёта, но не зачислены в другой.
Вот тут и должны быть применены принципы ACID.
Следуя принципу ACID, база данных будет целостна тогда и только тогда, когда она будет содержать все результаты успешно выполненных запросов, выполненных в транзакции. Любая ACID совместимая БД гарантирует, что будут применены изменения только успешных транзакций. В случае ошибки в транзакции, данные не будут изменены.
Таким образом, СУБД, совместимые с ACID, дают организациям уверенность в том, что данные в их базе данных будут целостны, даже если произойдёт какой-либо сбой в середине выполнения транзакции.
Типы сбоев
Ошибка транзакции
Эта ошибка может произойти из-за некорректных входных данных или любых других нарушений целостности. Она так же возникает в результате тайм-аута, либо в результате deadlock.
Системный сбой
Системный сбой может быть из-за ошибки в коде СУБД, либо аппаратного сбоя.
Медийные сбои
Эти сбои случаются, когда запись или чтение из хранилища невозможны (например сбой в работе жёсткого диска, либо ошибки в работе операционной системе). Эти ошибки возникают намного реже, чем первые 2 типа.
Следование ACID принципам
Все популярные реляционные базы данных следуют принципам ACID. Все они имеют инструменты, обеспечивающие целостность данных при сбоях программного и аппаратного обеспечения, а также при любых неудачных транзакциях.
Но с NoSQL базами данных ситуация обстоит немного по-другому. Эти базы данных часто предназначены для обеспечения высокой доступности в кластере, а обычно это означает, что в некоторой степени жертвуют консистентностью и/или стойкостью. Однако большинство NoSQL баз данных в некоторой степени могут обеспечить атомарность.
Но всё же, большинстве NoSQL баз данных заложены основы целостности данных, что означает, что данные могут быть не синхронизированы какое-то время, но в конечном итоге они всё таки будут синхронизированы.
Вдобавок, некоторые разработчики, такие как MarkLogic, OrientDB и Neo4j, предлагают ACID-совместимые системы управления базами данных NoSQL.
Ссылка на оригинал статьи: https://database.guide/what-is-acid-in-databases/
угольная кислота | Формула, использование и факты
- Связанные темы:
- мочевина
барбитуровая кислота
изоцианат
дициклогексилкарбодиимид
карбамат
См. все связанные материалы →
угольная кислота , (H 2 CO 3 ), соединение элементов водорода, углерода и кислорода. Он образуется в небольших количествах при растворении его ангидрида, двуокиси углерода (CO 2 ), в воде.
CO 2 + H 2 O ⇌ H 2 CO 3 Преобладающими видами являются просто свободно гидратированные молекулы CO 2 . Угольную кислоту можно рассматривать как двухосновную кислоту, из которой могут быть образованы два ряда солей, а именно гидрокарбонаты, содержащие HCO 3 − , и карбонаты, содержащие CO 3 2− . H 2 CO 3 + H 2 O ⇌ H 3 O + + HCO 3 —
HCO 3 — + H 2 O ⇌ H 3 O + + CO 3 2- . Однако на поведении с кислотой-базой на карбин-аизировании. скорости некоторых участвующих реакций, а также их зависимость от рН системы. Например, при рН менее 8 основные реакции и их относительная скорость следующие: СО 2 + Н 2 О ⇌ Н 2 СО 3 (медленно)
H 2 CO 3 + OH — ⇌ HCO 3 — + H 2 O (Fast) выше pH 10 Следующие реакции важны: CO 2 + OH — 4 ⇌ 4 ⇌ 4 ⇌ 4 ⇌ 4 ⇌ 4. HCO 3 — (медленное)
HCO 3 — + OH — ⇌ CO 3 2- + H 2 O (FAST) между ph 8 и 10, 100034 + H 2 O (FAST) между pH 8 и 10, 10, H 2 O (FAST). указанные выше равновесные реакции являются значительными.
Дополнительная информация по этой теме
оксикислоты: Угольная кислота и карбонатные соли
Угольная кислота (h3CO3) образуется в небольших количествах, когда ее ангидрид, диоксид углерода (CO2), растворяется в…
Углекислота играет роль в формировании пещер и пещерных образований, таких как сталактиты и сталагмиты. Самые большие и наиболее распространенные пещеры образуются в результате растворения известняка или доломита под действием воды, богатой углекислотой, полученной в результате недавних дождей. Кальцит в сталактитах и сталагмитах происходит из вышележащего известняка вблизи границы раздела коренной породы и почвы. Дождевая вода, просачивающаяся через почву, поглощает углекислый газ из богатой углекислым газом почвы и образует разбавленный раствор угольной кислоты. Когда эта кислая вода достигает основания почвы, она вступает в реакцию с кальцитом в известняковой породе и переводит часть его в раствор. Вода продолжает свой нисходящий поток через узкие трещины и трещины в ненасыщенной зоне с незначительной дальнейшей химической реакцией. Когда вода выходит из свода пещеры, углекислый газ теряется в атмосфере пещеры, а часть карбоната кальция выпадает в осадок. Проникающая вода действует как кальцитовый насос, удаляя его с верхней части коренной породы и повторно откладывая в пещере внизу.
Угольная кислота играет важную роль в переносе углекислого газа кровью. Углекислый газ поступает в кровь в тканях, потому что его местное парциальное давление больше, чем его парциальное давление в крови, протекающей через ткани. Когда углекислый газ попадает в кровь, он соединяется с водой с образованием угольной кислоты, которая диссоциирует на ионы водорода (H + ) и ионы бикарбоната (HCO 3 — ). Высвобождаемые ионы водорода минимально влияют на кислотность крови, поскольку белки крови, особенно гемоглобин, являются эффективными буферными агентами. (Буферный раствор сопротивляется изменению кислотности за счет соединения с добавленными ионами водорода и, по существу, их инактивации. ) Естественное превращение двуокиси углерода в угольную кислоту — относительно медленный процесс; однако карбоангидраза, белковый фермент, присутствующий внутри эритроцита, катализирует эту реакцию с достаточной скоростью, чтобы она выполнялась всего за долю секунды. Поскольку фермент присутствует только внутри эритроцита, бикарбонат накапливается в нем в гораздо большей степени, чем в плазме. Способность крови переносить углекислый газ в виде бикарбоната усиливается за счет системы переноса ионов внутри мембраны эритроцитов, которая одновременно перемещает ион бикарбоната из клетки в плазму в обмен на ион хлорида. Одновременный обмен этих двух ионов, известный как хлоридный сдвиг, позволяет использовать плазму в качестве места хранения бикарбоната без изменения электрического заряда ни плазмы, ни эритроцита. Только 26 процентов общего содержания углекислого газа в крови находится в виде бикарбоната внутри эритроцита, а 62 процента существует в виде бикарбоната в плазме; однако основная масса ионов бикарбоната сначала образуется внутри клетки, а затем транспортируется в плазму. Обратная последовательность реакций возникает, когда кровь достигает легких, где парциальное давление углекислого газа ниже, чем в крови.
Редакторы Британской энциклопедии Эта статья была недавно отредактирована и обновлена Эриком Грегерсеном.
нуклеиновая кислота | Определение, функция, структура и типы
полинуклеотидная цепь дезоксирибонуклеиновой кислоты (ДНК)
Смотреть все СМИ
- Ключевые люди:
- Хар Гобинд Хорана
Уолтер Гилберт
Торбьорн Оскар Касперссон
Аарон Клуг
Феб Левен
- Похожие темы:
- РНК
ДНК
нуклеотид
пара оснований
нуклеозид
Просмотреть весь соответствующий контент →
Самые популярные вопросы
Что такое нуклеиновые кислоты?
Нуклеиновые кислоты представляют собой встречающиеся в природе химические соединения, которые служат основными молекулами, несущими информацию в клетках. Они играют особенно важную роль в управлении синтезом белка. Двумя основными классами нуклеиновых кислот являются дезоксирибонуклеиновая кислота (ДНК) и рибонуклеиновая кислота (РНК).
Какова основная структура нуклеиновой кислоты?
Нуклеиновые кислоты представляют собой длинноцепочечные молекулы, состоящие из ряда почти идентичных строительных блоков, называемых нуклеотидами. Каждый нуклеотид состоит из азотсодержащего ароматического основания, присоединенного к пентозному (пятиуглеродному) сахару, который, в свою очередь, присоединен к фосфатной группе.
Какие азотсодержащие основания входят в состав нуклеиновых кислот?
Каждая нуклеиновая кислота содержит четыре из пяти возможных азотсодержащих оснований: аденин (A), гуанин (G), цитозин (C), тимин (T) и урацил (U). A и G относятся к категории пуринов, а C, T и U называются пиримидинами. Все нуклеиновые кислоты содержат основания А, С и G; Однако T встречается только в ДНК, а U — в РНК.
Когда были открыты нуклеиновые кислоты?
Нуклеиновые кислоты были открыты в 1869 году швейцарским биохимиком Фридрихом Мишером.
Сводка
Прочтите краткий обзор этой темы
нуклеиновая кислота , встречающееся в природе химическое соединение, способное расщепляться с образованием фосфорной кислоты, сахаров и смеси органических оснований (пуринов и пиримидинов). Нуклеиновые кислоты являются основными информационными молекулами клетки и, направляя процесс синтеза белков, определяют наследуемые признаки каждого живого существа. Двумя основными классами нуклеиновых кислот являются дезоксирибонуклеиновая кислота (ДНК) и рибонуклеиновая кислота (РНК). ДНК является главным чертежом жизни и составляет генетический материал всех свободноживущих организмов и большинства вирусов. РНК является генетическим материалом некоторых вирусов, но она также присутствует во всех живых клетках, где она играет важную роль в определенных процессах, таких как создание белков.
В этой статье рассматривается химия нуклеиновых кислот, описываются структуры и свойства, которые позволяют им служить передатчиками генетической информации. Для обсуждения генетического кода см. наследственность, а для обсуждения роли нуклеиновых кислот в синтезе белка см. метаболизм.
Нуклеотиды: строительные блоки нуклеиновых кислот
Основная структура
Нуклеиновые кислоты представляют собой полинуклеотиды, т. е. молекулы с длинными цепочками, состоящие из серии почти идентичных строительных блоков, называемых нуклеотидами. Каждый нуклеотид состоит из азотсодержащего ароматического основания, присоединенного к пентозному (пятиуглеродному) сахару, который, в свою очередь, присоединен к фосфатной группе. Каждая нуклеиновая кислота содержит четыре из пяти возможных азотсодержащих оснований: аденин (А), гуанин (Г), цитозин (Ц), тимин (Т) и урацил (У). A и G классифицируются как пурины, а C, T и U вместе называются пиримидинами. Все нуклеиновые кислоты содержат основания А, С и G; Однако T встречается только в ДНК, а U — в РНК. Пентозный сахар в ДНК (2′-дезоксирибоза) отличается от сахара в РНК (рибозы) отсутствием гидроксильной группы (—ОН) на 2′-углероде сахарного кольца. Без присоединенной фосфатной группы сахар, присоединенный к одному из оснований, известен как нуклеозид. Фосфатная группа соединяет последовательные остатки сахара, связывая 5′-гидроксильную группу одного сахара с 3′-гидроксильной группой следующего сахара в цепи. Эти нуклеозидные связи называются фосфодиэфирными связями и одинаковы в РНК и ДНК.
Нуклеотиды синтезируются из легкодоступных предшественников в клетке. Рибозофосфатная часть как пуриновых, так и пиримидиновых нуклеотидов синтезируется из глюкозы по пентозофосфатному пути. Первым синтезируется шестиатомное пиримидиновое кольцо, которое затем присоединяется к фосфату рибозы. Два кольца в пуринах синтезируются при присоединении к рибозофосфату во время сборки адениновых или гуаниновых нуклеозидов. В обоих случаях конечным продуктом является нуклеотид, несущий фосфат, присоединенный к 5′-углероду сахара. Наконец, специальный фермент, называемый киназой, добавляет две фосфатные группы, используя аденозинтрифосфат (АТФ) в качестве донора фосфата, с образованием рибонуклеозидтрифосфата, непосредственного предшественника РНК. Для ДНК 2′-гидроксильная группа удаляется из рибонуклеозиддифосфата с образованием дезоксирибонуклеозиддифосфата. Дополнительная фосфатная группа из АТФ затем добавляется другой киназой с образованием дезоксирибонуклеозидтрифосфата, непосредственного предшественника ДНК.
Викторина «Британника»
Наука: правда или вымысел?
Вас увлекает физика? Устали от геологии? С помощью этих вопросов отделите научный факт от вымысла.
В ходе нормального клеточного метаболизма РНК постоянно образуется и расщепляется. Остатки пурина и пиримидина повторно используются несколькими путями утилизации для создания большего количества генетического материала. Пурин сохраняется в виде соответствующего нуклеотида, тогда как пиримидин сохраняется в виде нуклеозида.