Одноразові клієнти. Сегментація для отримання покупок. Як створити варіант для транзакції за допомогою SHD0? Приклад використання розпочати транзакцію 1с

У рамках підготовки до сертифікації 1С «Експерт» напередодні двох дуже важливих та глобальних тем — блокувань і хотілося б розібрати те, без чого неможливі вищезгадані поняття, — транзакція СУБД.

Транзакція- Логічно пов'язана, неподільна послідовність дій. Транзакція може бути або виконана цілком або взагалі не виконана. Для фіксації транзакції до СУБД використовується метод COMMIT.

Типовий приклад транзакції - переказ коштів з одного рахунку на інший:

  1. розпочати транзакцію;
  2. прочитати кількість коштів на рахунку номер 123;
  3. зменшити баланс рахунку 123 на 100 рублів;
  4. зберегти баланс рахунку №123;
  5. прочитати кількість коштів на рахунку №321;
  6. збільшити баланс на 100 рублів;
  7. записати нову кількість коштів на рахунку 321;
  8. зафіксувати транзакцію.

Отримайте 267 відеоуроків з 1С безкоштовно:

Як бачимо, якщо транзакція виконано в повному обсязі, вона немає сенсу.

Ключові вимоги (ACID) до транзакційної СУБД

Одним із найпоширеніших наборів вимог до транзакцій та транзакційних СУБД є набір ACID (Atomicity, Consistency, Isolation, Durability). Це ті властивості, які має мати будь-яка транзакція:

  • Атомарність (Atomicity)- ніяка транзакція не повинна бути частково зафіксована;
  • Узгодженість (Consistency)— система перебуває в узгодженому стані до початку транзакції та має залишитися у узгодженому стані після завершення транзакції;
  • Ізольованість (Isolation)— під час виконання транзакції паралельні транзакції не повинні впливати на результат;
  • Надійність (Durability)- у разі збою зміни, зроблені успішно завершеною транзакцією, повинні залишитися збереженими після повернення системи до роботи.

Транзакції в 1С

Транзакції в 1С 8.3 та 8.2 створюються як автоматично, так і описуються розробниками.

За допомогою методу Транзакція Активна() можна дізнатися, чи активна транзакція.

Приклад автоматичної транзакції - обробка проведення документа, запис елемента довідника базу даних, запис набору записів регістру відомостей тощо.

У кожного клієнта є свої повторювані звички та традиції. Будь то улюблений день для покупок, переваги за середньою вартістю товару або додатковими опціями до продукту. Вся ця інформація допоможе нам стимулювати клієнта до здійснення другої покупки та переходу з нового користувача до постійного клієнта.

Переходимо від одноразових покупок до постійних клієнтів

Ну що ж, вам вдалося сконвертувати клієнта. Це круто, а що далі? За даними статистики від 30% до 80% покупців в ecommerce індустрії роблять замовлення лише раз за весь свій життєвий цикл. У сфері ігор друге замовлення здійснює 60% клієнтів. Як нам отримати постійних клієнтів за таких невтішних чисельних даних?

Це питання хвилює маркетологів у всьому світі. Вони трудяться, докладаючи всіх своїх зусиль на переклад клієнтів з одноразових у постійних. Чи це первинні замовлення в рітейлі або депозити в онлайн-іграх. Чому друге замовлення настільки важливе? Якщо клієнт здійснює друге замовлення або вносить другий депозит, ймовірність здійснення третього замовлення зростає в десятки разів у порівнянні з клієнтами, що здійснили тільки одне замовлення.

На таблиці нижче об'єднані дані десяти провідних ecommerce компаній Європи та США. Як видно з графіка, ймовірність здійснення наступної транзакції зростає з числом поточних транзакцій.


Імовірність здійснення наступної транзакції залежно від кількості поточних транзакцій

Багато компаній об'єднують одноразових клієнтів в одну групу та використовують різні методики та посилки для стимулювання другої покупки. Звучить як непоганий план, чи не так? Так чи інакше, всі клієнти у групі – одноразові покупці. Але ми зібралися тут для обговорення іншого підходу. Цей другий метод полягає у поділі групи одноразових клієнтів на різні сегменти залежно від характеристик їхньої першої транзакції. Нирнемо глибше і розглянемо причини такої сегментації.

День тижня

Ми почнемо з аналізу поведінки багаторазових покупців 10 провідних компаній і спробуємо зрозуміти, чи є взаємозв'язок між днем ​​першого замовлення та днем ​​другого замовлення. Почнемо із аналізу ставок на спорт. У цій тематиці клієнт вносить депозит у день, коли відбувається найбільше матчів його улюбленої команди, зазвичай у суботу або неділю. Імовірність таких клієнтів повернутися і внести ставки в ці дні є достатньо високою.

Ми зібрали дані та провели тестування, результати виявилися такими ж, як ми очікували. Здебільшого, другий депозит залишали того ж дня тижня, що й перший. Це видно з максимального значення ймовірності, яка знаходиться на діагоналі квадрата.


Імовірність здійснення транзакції другої транзакції залежно від дня тижня першої транзакції у ставках на спорт

Залежність між цими двома транзакціями може допомогти краще таргетувати рекламні активності на різні когорти одноразових клієнтів. даному випадкуу нас є 7 груп, заснованих на дні першої транзакції) і нагадувати про здійснення другої транзакції у відповідні дні. Цікавішим кроком є ​​тестування цієї гіпотези в рітейлі.


Імовірність здійснення транзакції другої транзакції залежно від дня тижня першої транзакції в рітейлі

Ми можемо побачити подібну ситуацію. Покупці здійснюють другу покупку того ж дня тижня, що й першу. Важливо відзначити, що дисперсія у сфері рітейлу була вищою, ніж у сфері ставок на спорт. Але сама залежність виявлялася кожної компанії. Найпопулярніший день для покупок – понеділок, найнепопулярніший – неділя. Якщо розглянути залежності між замовленнями тільки для одного бренду, то отримаємо ось що.


Імовірність здійснення транзакції другої транзакції залежно від дня тижня першої транзакції в рітейлі для одного бренду

У нас є просте пояснення такої поведінки для ставок на спорт, але чому ми бачимо такий результат у рітейлі? Причина може полягати в тому, що покупці мають певні патерни в житті. Ви ходите в зал по четвергах і п'ятницях, гуляєте з сім'єю у вихідні, залишаєтеся допізна на роботі по понеділках і зустрічаєтеся з друзями по п'ятницях. Покупець патерн не виглядає дивним, враховуючи всі інші.

Час доби

Як ви могли здогадатися, ми протестували аналогічні гіпотези для доби. Чи є кореляція між часом доби першого замовлення та другого, якщо друге замовлення здійснили як мінімум через сім днів пізніше? Ми поділили день на 4 періоди: ніч, ранок, вечір та опівдні – і перевірили розподіл другої замовлень для кожного тимчасового періоду для 6 брендів.


Ймовірність другого замовлення в залежності від часу доби першого замовлення

Залежність між першим та другим замовленням за добою виглядає очевидною. Покупці, які зробили замовлення пізно вночі вперше, з великою ймовірністю зроблять друге замовлення в той же час.

Вартість товарів на замовлення

Як маркетологи, ми прагнемо збільшити кількість товарів на замовлення. До продажу у світі маркетингу – спосіб життя, а якщо ні – то слід було б. Але чи маємо ми завжди намагатися допродати товар? Чи є таке рішення найкращим для всіх наших клієнтів? У проведеному аналізі ми досліджували, чи збільшується вартість товарів у другому замовленні, порівняно з першим.

Як джерела даних використовуються різні бренди, тому для кожного бренду виділили окремі сегменти з величиною вартості товару. Вийшло 6 цінових груп.


Імовірність вартості другого замовлення в залежності від вартості першого замовлення

Більшість клієнтів, чиї замовлення були здійснені в низькому ціновому діапазоні, залишилися в тому самому діапазоні та в другому замовленні.

Висновок

Наш аналіз вище показує, що ми можемо взяти з перших замовлень. Головне, що нам слід запам'ятати, що не слід поміщати всіх одноразових клієнтів до однієї групи. Варто сегментувати клієнтів залежно від їхнього дня тижня та часу покупки, вартості замовлення.
Використання цих методів та кроків допоможе вам краще зрозуміти, як збільшити LTV та отримати більше лояльних клієнтів.

Заголовок вийшов яскравим, але накипіло. Відразу скажу, що йтиметься про 1С. Дорогі 1С-ники, ви не вмієте працювати з транзакціями і не розумієте, що таке винятки. Такого висновку я дійшов, переглядаючи велику кількість коду на 1С, що народжується в нетрях вітчизняного ентерпрайзу. В типових конфігураціяхз цим все досить добре, але жахлива кількість рекомендованого коду написано некомпетентно з точки зору роботи з базою даних. Ви коли-небудь бачили у себе помилку "У цій транзакції вже відбувалися помилки"? Якщо так - заголовок статті відноситься і до вас. Давайте під катом розберемося, що таке транзакції і як правильно з ними поводитися, працюючи з 1С.

Чому треба бити на сполох

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


Чому це погано? Тому що дана помилканічого не каже вам про те, де насправді трапилася проблема. Коли в саппорт від користувача приходить скріншот з таким текстом, а особливо для серверного коду, з яким інтерактивно не працює людина - це ... Хотів написати "критична помилка", але подумав, що це buzzword, на який ніхто не звертає уваги. Це дупа. Це помилка програмування. Це не випадковий збій. Це косяк, який треба негайно переробляти. Тому що, коли у вас фонові процеси сервера стануть вночі і компанія почне стрімко втрачати гроші, то "У даній транзакції вже відбувалися помилки" це останнє, що ви захочете побачити у діагностичних логах.


Є, звичайно, ймовірність, що технологічний журнал сервера (адже він у вас включений у продакшені, так?) якось допоможе діагностувати проблему, але я зараз навскідку не можу придумати варіант - як саме в ньому знайти реальну причину вказаної помилки. А реальна причина одна – програміст Вася отримав виняток усередині транзакції та вирішив, що один раз – не карабас "подумаєш, помилка, підемо далі".

Що таке транзакції у 1С

Незручно писати про азбучні істини, але, мабуть, трохи доведеться. Транзакції в 1С - це те саме, що транзакції в СУБД. Це не якісь особливі "1С-ні" транзакції, це і є транзакції до СУБД. Відповідно до загальної ідеї транзакцій, вони можуть або виконатися цілком, або не здійснитися зовсім. Всі зміни в таблицях бази даних, виконані всередині транзакції, можуть бути скасовані, ніби нічого не було.


Далі потрібно розуміти, що в 1С не підтримуються вкладені транзакції. Власне, вони не підтримуються не "в 1С", а взагалі не підтримуються. Принаймні тими СУБД, з якими вміє працювати 1С. Вкладених транзакцій, наприклад, немає в MS SQL та Postgres. Кожен "вкладений" виклик Почати транзакцію просто збільшує лічильник транзакцій, а кожен виклик "зафіксувати транзакцію" - зменшує цей лічильник. Ця поведінка описана в багатьох книжок і статей, але висновки з цієї поведінки, певне, розібрані недостатньо. Строго кажучи, SQL є т.зв. SAVEPOINT, але 1С їх не використовує, та й річ досить специфічна.



Процедура Дуже КориснийІВажливийКод(СписокПосиланьДовідника) ПочатиТранзакцію(); Для кожного Посилання З СписокПосиланьДовідника Цикл Об'єктДовідника = Посилання.ОтриматиОб'єкт(); Об'єктДовідника. ЯкеТоПоле = "Я змінений з програмного коду"; Об'єктДовідника.Записати(); КінецьЦикл; Зафіксувати транзакцію (); КінецьПроцедури

Код англійською

Насправді ні. Мені зовсім не хочеться дублювати приклади англійською тільки заради того, щоб потішити любителів холіварів та священних воєн.


Ви ж, напевно, пишете такий код, так? Наведений приклад коду містить помилки. Як мінімум три. Знаєте, які? Про перше я скажу відразу, вона пов'язана з об'єктними блокуваннями і не стосується безпосередньо транзакцій. Про другу – трохи згодом. Третя помилка – це deadlock, який виникне при паралельному виконанні цього коду, але це тема для окремої статті, її розглядати зараз не будемо, щоб не ускладнювати код. Ключове словодля гуглення: deadlock керовані блокування.


Зверніть увагу, простий код. Такого у ваших 1С-систем просто вагон. І він містить одразу, як мінімум, 3 помилки. Задумайтесь на дозвіллі, скільки помилок є у складніших сценаріях роботи з транзакціями, написаними вашими програмістами 1С:)

Об'єктні блокування

Отже, перша помилка. У 1С існують об'єктні блокування, так звані "оптимістичні" та "песимістичні". Хто вигадав термін, не знаю, вбив би:). Цілком неможливо запам'ятати, яка з них за що відповідає. Докладно про них написано та , а також у іншій IT-літературі загального призначення.


Суть проблеми в тому, що в зазначеному прикладі коду змінюється об'єкт бази даних, але в іншому сеансі може сидіти інтерактивний користувач (або сусідній потік фону), який теж буде змінювати об'єкт. Тут один з вас може отримати помилку "запис було змінено або видалено". Якщо це відбудеться в інтерактивному сеансі, то користувач почеше ріпу, лається і спробує перевідкрити форму. Якщо це станеться у фоновому потоці, вам доведеться шукати це в логах. А журнал реєстрації, як ви знаєте, повільний, а ELK-стек для журналів 1С у нас в галузі налаштовують одиниці ... (ми, до речі, входимо до тих, хто налаштовує та іншим допомагає налаштовувати


Коротше кажучи, це прикра помилка і краще, щоб її не було. Тому в стандартах розробки чітко написано, що перед зміною об'єктів необхідно ставити на них об'єктне блокування методом Об'єктДовідника.Заблокувати()Тоді паралельний сеанс (який теж повинен так вчинити) не зможе почати операцію зміни і отримає очікувану, керовану відмову.

А тепер про транзакції

З першою помилкою розібралися, давайте перейдемо до другої.


Якщо не передбачити перевірку виключення в цьому методі, то виняток (наприклад, можливий на методі "Записати()") викине вас з даного методу без завершення транзакції. Виняток із методу "Записати" може бути викинуто з різних причин, наприклад, спрацюють якісь прикладні перевірки в бізнес-логіці, або виникне згадане вище об'єктне блокування. Так чи інакше, друга помилка каже: код, який розпочав транзакцію, не несе відповідальності за її завершення.



Саме так я назвав би цю проблему. У нашому статичному аналізаторі коду 1С з урахуванням SonarQube ми навіть окремо вбудували таку діагностику. Зараз я працюю над її розвитком, і фантазія програмістів 1С, чий код потрапляє до мене на аналіз, часом шокує і тремтить.


Чому? Тому що викинутий вгору виняток усередині транзакції у 90% випадків не дасть цю транзакцію зафіксувати та призведе до помилки. Слід розуміти, що 1С автоматично відкочує незавершену транзакцію після повернення зі скриптового коду на рівень коду платформи. Доки ви знаходитесь на рівні коду 1С, транзакція залишається активною.


Піднімемося на рівень вище за стеком викликів:


Процедура ВажливийКод() СписокПосилань = ОтриматиДеТоСписокПосилань(); Дуже Корисний І Важливий Код (Список Посилань); КінецьПроцедури

Дивіться, що виходить. Наш проблемний метод викликається звідкись ззовні, вище за стеком. На рівні цього методу розробник уявлення не має - чи будуть якісь транзакції всередині методу Дуже Корисний І Важливий Код або їх не буде. А якщо будуть - то чи будуть всі вони завершені... Ми ж усе тут за мир та інкапсуляцію, вірно? Автор методу "Важний Код" не повинен думати про те, що саме відбувається всередині методу, що викликається ним. Того самого, у якому некоректно обробляється транзакція. У результаті спроба попрацювати з базою даних після викиду виключення зсередини транзакції, з високою ймовірністю призведе до того, що "У даній транзакції бла-бла…"

Розмазування транзакцій за методами

Друге правило "транзакційно-безпечного" коду: лічильник посилань транзакцій на початку методу і в його кінці повинен мати те саме значення. Не можна розпочинати транзакцію в одному методі та завершувати її в іншому. З цього правила, напевно, можна знайти винятки, але це буде якийсь низькорівневий код, який пишуть компетентніші люди. Загалом так писати не можна.


Наприклад:


Процедура ВажливийКод() СписокПосилань = ОтриматиДеТоСписокПосилань(); Дуже Корисний І Важливий Код (Список Посилань); Зафіксувати транзакцію (); // Путівка в пекло, серйозна розмова з автором про наші складні трудові відносини. КінецьПроцедури

Вище – неприйнятний говнокод. Не можна писати методи так, щоб сторона, що викликає, пам'ятала і стежила за можливими (або ймовірними - як знати) транзакціями всередині інших методів, які вона викликає. Це порушення інкапсуляції та розростання спагетті-коду, який неможливо трасувати, зберігаючи розум.


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

Намагаємося виправити код

Повернемося до вихідного методу та спробуємо його полагодити. Відразу скажу, що об'єктне блокування ми лагодити поки що не будемо, просто, щоб не ускладнювати код прикладу.

Перший підхід типового 1С-ника

Зазвичай програмісти 1С знають, що з запису може бути видано виняток. А ще вони бояться винятків, тому намагаються їх перехоплювати. Наприклад, ось так:


Процедура Дуже КориснийІВажливийКод(СписокПосиланьДовідника) ПочатиТранзакцію(); Для кожного Посилання З СписокПосиланьДовідника Цикл Об'єктДовідника = Посилання.ОтриматиОб'єкт(); Об'єктДовідника. ЯкеТоПоле = "Я змінений з програмного коду"; Спроба Об'єктДовідника.Записати(); Виняток Лог.Помилка("Не вдалося записати елемент %1", Посилання); Продовжити; КінецьСпроби; КінецьЦикл; Зафіксувати транзакцію (); КінецьПроцедури

Ну як стало краще, так? Адже тепер, можливі помилкизаписи обробляються і навіть логуються. Винятки більше не виникнуть під час запису об'єкта. І в лозі навіть видно - на якому об'єкті, не полінувався, вивів у повідомлення посилання замість лаконічного "Помилка запису довідника", як це часто люблять писати розробники, що вічно поспішають. Іншими словами, є турбота про користувача і зростання компетенцій.


Проте, досвідчений 1С-нік тут скаже, що ні, краще не стало. Насправді нічого не змінилося, а може навіть стало і гірше. У методі "Записати()" платформа 1С сама почне транзакцію запису, і ця транзакція буде вже вкладена по відношенню до нашої. І якщо в момент роботи з базою даних 1С свою транзакцію відкотить (наприклад, буде видано виняток бізнес-логіки), то наша транзакція верхнього рівня все одно буде позначена як зіпсована і її не можна буде зафіксувати. У результаті цей код так і залишиться проблемним і при спробі фіксації видасть "вже відбувалися помилки".


А тепер уявіть, що йдеться не про маленький метод, а про глибокий стек викликів, де в самому низу хтось узяв і "випустив" розпочату транзакцію зі свого методу. Верхньорівневі процедури можуть і гадки не мати, що хтось там унизу починав транзакції. У результаті весь код валиться з невиразною помилкою, яку розслідувати неможливо в принципі.


Код, який починає транзакцію, зобов'язаний завершити чи відкотити її.Незважаючи на жодні винятки. Кожна гілка коду має бути досліджена щодо виходу з методу без фіксації чи скасування транзакції.

Методи роботи з транзакціями в 1С

Не зайве нагадати, що взагалі 1С надає нам для роботи з транзакціями. Це всім відомі методи:

  • Розпочати транзакцію()
  • ЗафіксуватиТранзакцію()
  • СкасуватиТранзакцію()
  • Транзакція Активна()

Перші 3 способи очевидні і роблять те, що написано в їхній назві. Останній метод - повертає Істину, якщо лічильник транзакцій більший за нуль.


І є цікава особливість. Методи виходу з транзакції (Зафіксувати та Скасувати) викидають винятки, якщо лічильник транзакцій дорівнює нулю. Тобто, якщо викликати один із них поза транзакцією, то виникне помилка.


Як правильно користуватися цими методами? Дуже просто: треба прочитати сформульоване вище правило:


Як же дотриматися цього правила? Давайте спробуєм:


Вище ми вже зрозуміли, що метод Що Що - потенційно небезпечний. Він може видати якийсь виняток, і транзакція вилізе назовні з нашого методу. Окей, додамо обробник можливого виключення:


Розпочати транзакцію (); Спроба Робимо Що (); Виняток // Що ж написати тут? КінецьСпроби; Зафіксувати транзакцію ();

Відмінно, ми зловили помилку, що виникає, але що з нею робити? Записати повідомлення у лог? Ну, можливо, якщо код логування помилок має бути саме на цьому рівні і помилку ми тут чекаємо. А якщо ні? Якщо ми не чекали тут жодних помилок? Тоді ми повинні просто передати цей виняток вище, хай із ними розуміється інший шар архітектури. Робиться це оператором "Викликати Виняток" без аргументів. У цих ваших джава-сиплюсплюсах це робиться так само оператором throw.


Розпочати транзакцію (); Спроба Робимо Що (); Виняток Викликати Виняток; КінецьСпроби; Зафіксувати транзакцію ();

Так, стоп… Якщо ми просто прокидаємо виняток далі, то навіщо тут потрібна Спроба? А ось навіщо: правило змушує нас забезпечити завершення розпочатої транзакції.


Розпочати транзакцію (); Спроба Робимо Що (); Виняток Скасувати Транзакцію(); Викликати Виняток; КінецьСпроби; Зафіксувати транзакцію ();

Тепер, начебто, гарно. Однак, ми пам'ятаємо, що не довіряємо коду Робимо Що (). Раптом там усередині його автор не читав цієї статті і не вміє працювати з транзакціями? Раптом він там узяв, та й викликав метод Скасувати транзакцію чи навпаки, зафіксував її? Нам дуже важливо, щоб обробник виключення не породив нового виключення, інакше вихідну помилку буде втрачено і розслідування проблем стане неможливим. А ми пам'ятаємо, що методи Зафіксувати та Скасувати можуть видати виняток, якщо транзакція не існує. Тут-то й потрібний метод Транзакція Активна.

Фінальний варіант

Нарешті, ми можемо написати правильний, "транзакційно-безпечний" варіант коду. Ось він:


**UPD: у коментарях запропоновано більш безпечний варіант, коли Зафіксувати транзакцію розташовано всередині блоку Спроба. Тут наведено саме цей варіант, раніше Фіксація була після блоку Спроба-Виключення.


Розпочати транзакцію (); Спроба Робимо Що (); Зафіксувати транзакцію (); Виняток Якщо ТранзакціяАктивна() Тоді СкасуватиТранзакцію(); КінецьЯкщо; Викликати Виняток; КінецьСпроби;

Стривайте, але ж не тільки "Скасувати транзакцію" може видавати помилки. Чому ж тоді "Зафіксувати транзакцію" не обернуть у таку ж умову з "Транзакція активна"? Знову ж таки, за тим самим правилом: код, який розпочав транзакцію, повинен відповідати за її завершення.Наша транзакція необов'язково найперша, вона може бути вкладеною. На нашому рівні абстракції ми повинні дбати лише про нашу транзакцію. Усі інші мають бути нам нецікавими. Вони чужі, ми не повинні нести за них відповідальність. Саме НЕ ПОВИННІ. Не можна робити спроб з'ясування реального рівня лічильника транзакцій. Це знову порушить інкапсуляцію та призведе до "розмазування" логіки управління транзакціями. Ми перевірили активність лише в обробнику виключення і лише для того, щоб переконатися, що наш обробник не породить нового винятку, що "приховує" старе.

Чек-лист рефакторингу

Давайте розглянемо кілька найпоширеніших ситуацій, які потребують втручання у код.


Паттерн:


Розпочати транзакцію (); Робимо Що (); Зафіксувати транзакцію ();

Обернути в "безпечну" конструкцію з Спробою, Перевіркою активності та викидом.


Паттерн:


Якщо Не ТранзакціяАктивна() Тоді ПочатиТранзакцію() КінецьЯкщо

Аналіз та рефакторинг. Автор не розумів, що робить. Починати вкладені транзакції можна безпечно. Не потрібно перевіряти умову, потрібно просто розпочати вкладену транзакцію. Нижче за модулем він напевно ще там перекручується з їх фіксацією. Це гарантований геморой.


Приблизно схожий варіант:


Якщо ТранзакціяАктивна() Тоді ЗафіксуватиТранзакцію() КінецьЯкщо

аналогічно: фіксація транзакції за умовою – це дивно. Чому тут умова? Що хтось інший міг уже зафіксувати цю транзакцію? Привід для розгляду.


Паттерн:


ПочатиТранзакцію() Поки Вибірка.Наступний() Цикл // читання об'єкта за посиланням // запис об'єкта КонецЦикла; Зафіксувати транзакцію ();
  1. ввести кероване блокування, щоб уникнути deadlock
  2. ввести виклик методу Заблокувати
  3. обернути в "спробу", як показано вище

Паттерн:


ПочатиТранзакцію() Поки Вибірка.Наступний() Цикл Спроба Об'єкт.Записати(); Виняток Повідомити("Не вдалося записати"); КінецьСпроби; КінецьЦикл; Зафіксувати транзакцію ();

Ця транзакція вже не завершиться у разі виключення. Немає сенсу продовжувати цикл. Код потрібно переписати, звіряючись із вихідним завданням. Додатково надати більш інформативне повідомлення про помилку.

На закінчення

Я, як ви вже, мабуть, здогадалися, ставлюся до людей, які люблять платформу 1С та розробку на ній. До платформи, зрозуміло, є претензії, особливо в середовищі Highload, але загалом вона дозволяє недорого і швидко розробляти дуже якісні корпоративні додатки. Даючи з коробки і ORM, і GUI, і веб-інтерфейс, і Reporting і багато чого ще. У коментарях на Хабре зазвичай пишуть будь-яке зарозуміле, так от, хлопці - основна проблема 1С, як екосистеми - це не платформа і не вендор. Це дуже низький поріг входження, який дозволяє потрапляти в галузь людям, які не розуміють, що таке комп'ютер, база даних, клієнт-сервер, мережа і таке інше. 1С зробила розробку корпоративних додатків надто легкою. Я за 20 хвилин можу написати на ній облікову системудля закупівель/продажів з гнучкими звітами та веб-клієнтом. Після цього мені неважко подумати про себе, що і на великих масштабах можна писати приблизно так само. Якось там сама сама всередині зробить, не знаю як, але напевно зробить. Напишу-но я "Почати транзакцію()".

Додати теги

Слово «трансакція» прийшло до нас лише наприкінці 90-х років. Це був період розвитку сучасної банківської системи та загального комп'ютерного буму. Тоді в розмовній та літературній промові стало зустрічатися це поняття. І якщо з проблемами програмістів звичайні людистикаються нечасто, з банками доводиться мати справу всім. Практично будь-які операції - від перевірки стану рахунку до складних внутрішньобанківських платіжних переказів - можуть кваліфікуватися як транзакції. Це слово є у банківських операціях чи не частіше, ніж такі поняття, як «гроші» або «кредит». При цьому мало хто з клієнтів банку повністю розуміє його суть.

Значення слова

Транзакції – це певні процедури взаємодії будь-яких об'єктів за певний проміжок часу. Такі процедури були сформовані програмістами. Їм притаманний чіткий процедурний характер. Будь-яка транзакція – це сукупність трьох неодмінних складових:

  • запиту;
  • виконання;
  • звіту.

Процес звичайного проведення транзакції може бути досить складним, але результат цієї процедури має лише два стани. Тобто транзакція може бути виконаною, або вона не є такою.

Банківські транзакції

Що означає слово "транзакція"? Які процеси відбуваються, коли вона відбувається? Якщо точним, транзакції – це будь-які банківські операції, пов'язані з переміщенням коштів. Але найчастіше цей термін використовується під час використання електронних рахунків. Або він безпосередньо вказує на операції з банківськими картами.

Словосполучення "провести транзакції" означає операції з використанням електронного рахунку. Сюди входить оплата комунальних послуг, покупка товарів у магазині за допомогою пластикової картки, зарахування зарплат та стипендій та багато інших операцій із грошима.

Види транзакцій

У банківській справі розрізняють операції двох видів:

  1. Онлайн транзакції – це маніпуляції з безготівковими грошима за допомогою з'єднання з банківським центром у режимі реального часу. Найочевидніший приклад – робота з терміналом.
  2. Офлайн-транзакції – це здійснення банківської операції без безпосереднього контакту учасників. Наприклад, зарахування зарплати працівникам. З рахунку організації списуються кошти, а працівник лише отримує повідомлення про поповнення балансу свого поточного счёта.

Щоб краще зрозуміти суть банківських транзакцій, розглянемо кілька варіантів.

Переказ коштів

Найпростіший приклад подібної операції – переказ між власними рахунками, отримання чи зарахування грошей, внесення готівки через банкомат чи термінал. Подібні операції зазвичай проводять банк без комісії. Складніше справи з переказами між двома різними особами – у межах однієї фінансової установи комісія за переказ може досягати 3%. Якщо йдеться про різні банки всередині країни – комісія буде ще вищою. Найдорожчий переказ – до закордонних установ, оскільки, окрім комісії, там часто стягується так звана оплата за транзакцію.

Переклади

Переклади з одного рахунку в інший іноді призводять до прикрих помилок. Найменша неточність у написанні прізвища одержувача може призвести до блокування маніпуляції електронною системою безпеки. Вирішить проблему автоматична транзакція. Це відбувається, наприклад, при зарахуванні коштів на баланс одержувача за номером банківської картки. Так значно знижується можливість помилки. У разі обнулення транзакції, гроші просто повертаються на баланс власника. Щоправда, відбувається це протягом десяти чи п'ятнадцяти календарних днів.

Якщо відправник відсутній рахунок у банку, можна скористатися сервісом грошових переказів. Найвідоміші міжнародні оператори – MoneyGram, Western Union, Anelik, Contact та інші. Головна перевага таких операцій – найвища швидкість транзакції. Основний недолік – досить висока комісія.

Що робити у разі збою транзакції?

За будь-якої нестандартної ситуації, пов'язаної з переказом грошових коштів, потрібно відразу повідомляти про це оператору банку або терміналу. У такому разі висока ймовірність того, що гроші повернуться на баланс відправника або підуть за призначенням.
Оператор допоможе вам, якщо:

  • У процесі здійснення транзакції стався збій (зависла програма, відключилася електрика), а гроші вже пішли. Дзвінок на гарячу лініюзафіксує ваше звернення. Після процедури перевірки та усунення помилки фахівці зможуть довести операцію вручну.
  • Термінал або банкомат не видав квитанцію про транзакцію. Причина може бути банальною – відсутність касової стрічки в апараті. Після звернення до оператора вам буде запропоновано дублікат квитанції. Зазвичай його надсилають на вказану електронну адресу.
  • Помилка у вказаних реквізитах. Гроші пішли, але одержувач так і не побачив.
    ератор може допомогти вирішити цю проблему: наприклад, знайти помилку в номері рахунку одержувача. У цьому випадку гроші не доходять до клієнта через правила безпеки. Такі кошти не вилучаються банком, а зберігаються протягом десяти днів особливому тимчасовому рахунку. Якщо відправник вчасно звернеться до фінансової установи, вкаже час операції, суму переказу та відповість на кілька запитань, гроші буде розблоковано. Після утримання комісії за транзакцію, сума повернеться на баланс відправника.

Як видно, банківські транзакції – це цікава, необхідна процедура у житті кожного з нас. Наступного разу, виконуючи найпростіший переказ або знімаючи гроші з карти, подумайте над тим, як сильно полегшують подібні маніпуляції наше життя. Адже зараз ви вже напевно знаєте, що собою представляють транзакції. Значення слова не секрет для вас.

Чимало людей запитують, що ж собою являє транзакція? Адже зустрічається це слово постійно, особливо якщо людина працює з грошима. Якщо брати глобально - черговість операцій обміну даними після проведення яких вносяться системні зміни.

Найбільш поширений випадок використання терміна - у проведенні грошових переказів та купівлі товару. Це може бути:

  • Видача готівкових коштів у банкоматі чи відділенні банку;
  • Придбання певної кількості акцій на біржі;
  • Розрахунок за карткою у магазині.

Щойно проведення операції було підтверджено, а гроші відправлено – транзакцію вважають успішно виконаною. Гроші знімаються з рахунку покупця чи клієнта установи, а товар передається фізичній особі. Можна сказати - транзакція є способом добровільного перерахування грошей з рахунку людини, у бік особи, яка надає послуги. Усі транзакції записуються до бази даних фінансової установи. Неважливо, чи була операція успішною, чи ні. Наприклад, у разі неправильного зарахування коштів на банківську картку.

Але не варто думати, ніби поняття транзакції застосовується лише у фінансовій сфері. IT компанії також часто використовують цей термін, особливо якщо це стосується програмування баз даних. У цьому випадку термін означатиме певну послідовність змін, що вносилися в дату бази.

Тут також є два варіанти застосування. Коли операція схвалена, їй приписується Commit, якщо ж з якоїсь причини відбулася відмова, то присвоюється Rollback. Найчастіше це відбувається, коли якесь із чисел захотіли поділити на нуль або ввели суму, що не відповідає внесеній до бази даних раніше.

Види

Найпоширеніший випадок використання транзакції є оплата платіжною карткою з банку біля будь-якого торгового центру, магазину чи фінансової установи. Операція починається тоді, коли власник бажає сплатити товар, після чого дає свою банківську картку працівникові відповідальному за касу.

Далі картка міститься у спеціальний термінал, де потрібно лише підтвердити наступну операцію. Для цього потрібно ввести дані, визначені наперед ПІН-код. Далі пройде рішення терміналу, чи був введений пароль вірним, чи йому варто відмовити. У будь-якому випадку, інформація про проведення транзакції буде записана в певну базу даних. Відбувається це завдяки передачі даних до системи оплати, що обслуговує цю карту. І вже на цьому етапі проходить повноцінна перевірка достовірності введених даних. Адже вони можуть бути присутніми в платіжному аркуші, так і відсутніми.

Але у випадку, якщо все правильно - транзакція успішно проводиться і прямує прямо в банк-емітент. Через нього проводилося виробництво цієї розрахункової картки. Потім інформація про транзакцію надсилається до пресингового центру, де встановлюється інформація про права на використання платіжної системи.

Варто зазначити, що на одному з етапів виявляється помилка, невідповідність даних - то у проведенні транзакції просто відмовляється.

Області застосування

У різних сферах застосування використовуються різні позначення слова «транзакція»:

  • Економіка позначає їм внесення коштів із одного потокового рахунку в інший. Особливо це стосується угод купівлі-продажу;
  • Операції з банкоматами наводять як транзакцію видачу готівки клієнту, який використовував для їх отримання банківську картку або номер рахунку;
  • Політичне пояснення несе у собі угоду на взаємовигідні умови між двома сторонами.

Багато залежить від виданої у банку картки. Debit та кредитна картаобслуговуються по-різному. Безпосередній вплив також має пріоритет входу до системи, що встановлюється фінансовою структурою, яка видала картку. Залежно від цих факторів швидкість проведення операції буде різною.

Найпростіше виглядають операції з маленькими сумами грошей. У випадку, якщо людина вказала певне налаштування в параметрах, вона матиме можливість не вводити пароль під час проведення транзакції. Вона відбудеться в автоматичному режиміі якщо на рахунку буде достатня кількість коштів, вони будуть списані, а інформація про операцію запишеться в базу даних.

Навіть області, які зовсім не пов'язані з фінансами, оперують поняттям «транзакцій». Наприклад приклад психологія. Експерти цієї сфери називають транзакцією обмін стимулами, що виникають під час розмови двох осіб. Таке застосування є дещо надуманим, але має право на існування. Тепер ви знаєте, що таке транзакції.

Потрібно знати про транзакції хоча б вище наведену інформацію, тому що без них обійтися сучасному світіпросто неможливо. А значить мінімальне уявлення все ж таки слід мати.