@drawoharaя ❤️ це! << натисни мене 🐛 🫖 🧚
/crap-developers-fear-mongo-and-worship-the-rdbms
опубліковано: 2015-04-22

TL; DR;

99.9% розробників веб-додатків вважають, що правильне використання СУБД і транзакцій захищає їхні додатки від поганих даних і серйозних помилок якості даних. Вони ЦІЛКОМ НЕПРАВІ.

Я з великим інтересом прочитав чудову статтю Кайла Кінгсбері про модель консистенції Mongo на https://aphyr.com/posts/322-call-me-maybe-mongodb-stale-reads

Очевидно, що цей хлопець дуже розумний і знає, про що говорить. Він робить справу, і все в цій статті є цікавим і добре складеним.

Але мене здивували коментарі та те, що вони розповідають про середнього професійного розробника:

Розробники вважають, що використання СУБД робить їхні дані безпечними, і вони абсолютно неправі

Я не можу сказати, скільки разів я вступав у суперечки з "професійними" розробниками та особливо з дурними сисадмінами, які справді вірять, що, просто кажучи слово СУБД, обертаючи курку три рази навколо голови та підключаючись до магічного єдинорога баз даних, їхні дані будуть безпечні та цілі, як ви знаєте, ... (щось-щось про) ... банківські транзакції та все той (нсенс) розмов про транзакції та fsync. І ціла купа іншого, про що жоден розробник, якого я коли-небудь зустрічав, насправді не розуміє чи не розглядав у контексті HTTP-додатку (підказка: безстановий).

Перш ніж продовжити, я викидаю виклик:

Знайдіть мене на /contact або /team/ara-t-howard. Тепер продовжуймо...

Розгадай мені, розробнику: що не так з цим шляхом коду:

  @db.transaction do
    if no_user_exists_with_conditions?
      @user = make_that_user_exists_with_those_conditions!
      deliver_an_activation_email_to!(@user)
    end
  end

Дозвольте мені розповісти вам щось, що зруйнує ваш світ:

ЦЕЙ КОД ЗОВСІМ ЗЛАМАНИЙ НА ВСІХ ОСНОВНИХ СУБД, ТА ПРАКТИЧНО ВСІХ
ДОДАТКАХ, У СВІТІ

Я запевняю вас, що лист піде двічі.

Пояснення транзакцій виходить за межі цієї статті, але дозвольте мені представити вам "фантомні читання"

http://uk.wikipedia.org/wiki/Isolation_%28database_systems%29#Phantom_reads

У вищенаведеному коді друга паралельна транзакція може спричинити наступне:

  @db.transaction do
    if no_user_exists_with_conditions?
      # тим часом, друга транзакція створила дубльованого користувача...
      # наступне буде виконано успішно в обидвох транзакціях
      @user = make_that_user_exists_with_those_conditions!
      # обидві транзакції відправлять лист
      deliver_an_activation_email_to!(@user)
    end
  end
  # одна з транзакцій не вдасться та вибухне, але до того часу,
  # буде запізніло: лист буде відправлено двічі, а помилка вже відбулася

Я знаю, ви не можете в це повірити. Але це лише тому, що ви ніколи не потрудилися прочитати інструкцію щодо того, що означає "транзакція". Почніть тут:

http://www.postgresql.org/docs/9.1/static/transaction-iso.html

Зверніть увагу на цю маленьку таблицю. Дозвольте мені перекласти її для вас:

І тому я запитую вас, яке інженерне рішення гірше:

п.с. Я працював над великомасштабними фінансовими, реальночасовими та високодоступними системами, які використовують як Mongo, так і PostgreSQL. Це overly складно в будь-якому випадку.

п.п.с. Я намагався прокоментувати ваш блог, Кайл, але коментарі вибухнули ;-)