Я шукаю NoSQL для пошуку альтернатив базі даних. Що робити, якщо я хочу чутливі до такого роду речі на основі транзакцій?
Я шукаю NoSQL для пошуку альтернатив базі даних. Що робити, якщо я хочу чутливі до такого роду речі на основі транзакцій?
Відповіді:
Взагалі кажучи, рішення NoSQL мають меншу вагу транзакційної семантики, ніж реляційні бази даних, але все ж мають засоби для атомних операцій на певному рівні.
Як правило, ті, які виконують реплікацію майстер-майстер, забезпечують менший рівень узгодженості та більшу доступність. Тож слід вибрати правильний інструмент для правильної проблеми.
Багато пропонують операції на рівні одного документа (або рядка тощо). Наприклад, з MongoDB існує атомність в одному документі, але документи можуть бути досить багатими, тому це зазвичай працює досить добре - докладніше тут .
Це найближча відповідь, яку я знайшов, і яка стосується будь-якої бази даних NoSQL. Це у дописі блогу 2007 року від Адама Віггінса з Heroku.com:
Старим прикладом використання транзакції бази даних для перенесення грошей з одного банківського рахунку на інший є загальний бик. Правильним рішенням є збереження списку подій книги (переказів між рахунками) і відображення поточного балансу як суми книги. Якщо ви програмуєте функціональною мовою (або думаєте таким чином), це очевидно.
З: http://adam.heroku.com/past/2007/12/17/a_world_without_sql/ (його веб-сайт чудово підходить для ідей щодо масштабованості.)
Я трактував вищезазначений параграф як:
Більше інформації. щодо черг / фонових працівників: http://adam.heroku.com/past/2009/4/14/building_a_queuebacked_feed_reader_part_1/
Клієнт (він же член або замовник) виконує такі кроки, щоб забрати гроші:
Ви можете використовувати Heroku.com, щоб швидко створити невеликий макет, якщо вам подобається Node.js або Ruby / Rack.
Загальна ідея здається досить простою і набагато кращою, ніж використання транзакцій, запечених у базі даних, що робить її надскладною для масштабування.
Застереження: Я ще ніяк не реалізував це. Я читав про ці речі з цікавості, хоча в них у мене немає практичної потреби. Так, @gbn має рацію, що RDBMS з транзакціями, мабуть, буде достатнім для потреб Тіммі та мене. Тим не менше, було б цікаво спостерігати, наскільки далеко ви можете зайняти бази даних NoSQL за допомогою інструментів з відкритим кодом та веб-сайту, що називається " Торнадо з Бритви ".
NoSQL охоплює різноманітний набір інструментів та послуг, включаючи сховища ключ-значення, документи, графіки та широкі стовпці. Зазвичай вони намагаються поліпшити масштабованість сховища даних, зазвичай розподіляючи обробку даних. Для транзакцій потрібні ACID властивості того, як БД виконують операції користувача. ACID обмежує можливість покращення масштабованості: більшість інструментів NoSQL послаблюють критерії узгодженості операцій, щоб отримати відмовостійкість та доступність для масштабування, що ускладнює реалізацію транзакцій ACID.
Типовим теоретичним міркуванням розподілених сховищ даних є теорема CAP : не можна одночасно досягти узгодженості, доступності та допуску до розділів. Інструменти SQL, NoSQL та NewSQL можна класифікувати за тим, від чого вони відмовляються; тут можна знайти гарну цифру .
Новим, слабшим набором вимог, що замінюють кислоту, є BASE ("в основному доступний, м'який стан, можлива консистенція"). Однак врешті-решт послідовні інструменти ("зрештою всі звернення до елемента повернуть останнє оновлене значення") навряд чи прийнятні в транзакційних додатках, таких як банківська справа. Тут гарною ідеєю було б використовувати вбудовану в пам’ять, орієнтовану на стовпці та розподілену базу даних SQL / ACID, наприклад VoltDB ; Я пропоную розглянути ці рішення "NewSQL".
Просто хотів прокоментувати поради щодо грошових операцій у цій темі. Транзакції - це те, що ви дійсно хочете використовувати для грошових переказів.
Наведений приклад того, як здійснювати трансфери, дуже приємний та охайний.
Але в реальному житті переказ грошей може включати збори або платежі на інші рахунки. Люди отримують бонуси за користування певними картками, що надходять з іншого рахунку, або вони можуть отримувати збори зі свого рахунку на інший рахунок у тій самій системі. Комісії або платежі можуть різнитися залежно від фінансової операції, і, можливо, вам доведеться підтримувати бухгалтерську систему, яка відображає кредит і дебет кожної операції в міру її надходження.
Це означає, що ви хочете оновлювати більше одного рядка одночасно, оскільки кредит на одному рахунку може бути списаний на одному або декількох рахунках. Спочатку ви блокуєте рядки, щоб ніщо не могло змінитися до оновлення, а потім переконайтеся, що записані дані відповідають транзакції.
Ось чому ви дійсно хочете використовувати транзакції. Якщо щось піде не так, напишучи в один рядок, ви можете відмотати цілу купу оновлень, не закінчуючи суперечливі дані про фінансові операції.
Проблема однієї транзакції та двох операцій (наприклад, одна платить 5000 доларів, друга отримує 5000 доларів) - полягає в тому, що у вас є два рахунки з однаковим пріоритетом. Ви не можете використовувати один рахунок для підтвердження другого (або у зворотному порядку). У цьому випадку ви можете гарантувати, що лише один рахунок буде правильним (що підтверджується), другий (що підтверджує) може мати помилки. Давайте подивимося, чому це може не вдатися (використовуючи підхід до повідомлення, відправник підтверджується отримувачем):
Це гарантовано заощадить №1. Але хто гарантує, якщо №2 зазнає невдачі? Те саме для зворотного порядку.
Але це можливо, щоб реалізації були безпечними без транзакцій та з NoSQL. Завжди дозволяється використовувати третю особу, яка буде підтверджена від відправника та одержувача та гарантує, що ваша операція була виконана:
Цей запис транзакції гарантуватиме, що це нормально для масажу надсилання / отримання. Тепер ви можете перевіряти кожне повідомлення за ідентифікатором транзакції, і якщо воно отримане чи завершене - ви враховуєте його для балансу користувачів.
Залежить від вашої БД, але ... Я б сказав, загалом, для досягнення цього ви можете використовувати "оптимістичні транзакції", але, думаю, слід переконатися, що розумієте гарантії атомності реалізації бази даних (наприклад, який тип операцій запису та читання є атомними ).
Там , як видається, деякі дискусії в мережі про Hbase угод, якщо то будь-яка допомога.
Ви завжди можете використовувати підхід NoSQL у SQL DB. Здається, NoSQL зазвичай використовує "сховища даних ключ / значення": ви завжди можете застосувати це у бажаній системі СУБД, а отже, зберігати такі добрі речі, як транзакції, властивості ACID, підтримку вашої дружньої DBA тощо, одночасно реалізуючи переваги продуктивності та гнучкості NoSQL. , наприклад, через таблицю, таку як
CREATE TABLE MY_KEY_VALUE_DATA
(
id_content INTEGER PRIMARY KEY,
b_content BLOB
);
Бонусом є те, що ви можете додати сюди додаткові поля, щоб зв’язати свій вміст з іншими, належним чином реляційними таблицями, зберігаючи при цьому громіздкий вміст у головному полі BLOB (або TEXT, якщо це зручно).
Особисто я віддаю перевагу поданню ТЕКСТУ, щоб ви не були прив'язані до мови для роботи з даними, наприклад, використання серіалізованої Java означає, що ви можете отримати доступ до вмісту з Perl для звітування, скажімо. ТЕКСТ також простіше налагоджувати і, як правило, працювати з ним як розробник.
подивіться на scalaris, це не no sql db з чіткою послідовністю та реалізованими транзакціями.
Ось чому я створюю рішення сховища документів NoSQL, щоб мати змогу використовувати "реальні" транзакції в корпоративних програмах із силою підходу до неструктурованих даних. Погляньте на http://djondb.com і сміливо додайте будь-яку функцію, яка, на вашу думку, може бути корисною.
безумовно, є й інші