Обеспечение атомарности

fixxxer

К.О.
Партнер клуба
Как сказал Redjik, мы это решили через batch-запросы с MACRO.
Макро-запрос - это передача в запросе нескольких действий и простейшей логики if-then, с использованием в зависимом вызове результата предыдущего.
О, я тоже подобное расшрением json-rpc делал. Правда, безо всяких macro, изобрел велосипед, без ифов, зато с фильтрами и циклами :)
 

fixxxer

К.О.
Партнер клуба
2PC мне кажется излишеством, те если я понял, прикол несколько в другом, там в дополнении к обычной транзакции есть возможность заранее спросить осущесвима ли она. а про постоянные соеденения и вебсервисы я тогда диаграмку рисовал, ну уж слишком заморочено получается
Я неточно выразился, да. Если база поддерживает 2pc полностью, включая join/resume, то постоянные соединения не нужны. А если нет, то 2pc-семантика реализуется на стороне вебсервиса. Со стороны клиента-то все равно, как это реализовано, главное - выглядит, как 2pc.
 

WMix

герр M:)ller
Партнер клуба
пример, rpc запрос просит почтовую марку(марки были куплены заранее штук 5000, и лежат на одном из свободно доступных сервисов внутри предприятия).
сервер находит свободную марку помечает ее используемой и возвращает номер.
клиент использует этот номер, чтоб сформировать отправление, сгенерить наклейку с баркодом номера этой марки к примеру, далее происходит сбой -> необходимо сказать что марка не используется более ROLLBACK (она денег стоит)
 

fixxxer

К.О.
Партнер клуба
Тут, конечно, от isolation level зависит. В дефолтном виде как-то так:
Код:
MariaDB [test]> create table codes (id serial, used_at datetime);
...........
MariaDB [test]> select * from codes;
+----+---------+
| id | used_at |
+----+---------+
|  1 | NULL    |
+----+---------+

1                                               2
----------------------------------------------- -----------------------------------------------
> begin;            
Query OK, 0 rows affected (0.00 sec)

                                                > begin;
                                                Query OK, 0 rows affected (0.00 sec)

> update codes
    set used_at = now()
    where id = 1 and used_at is null;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

                                                > update codes set used_at = now() where id = 1 and used_at is null;
                                                # ждем-с. если не дождались - lock timeout, опа, rollback
                                                
> commit;
Query OK
                                                > Query OK, 0 rows affected (3.41 sec)
                                                Rows matched: 0  Changed: 0  Warnings: 0
                                                
                                                # смотрим affected_rows, 0, опа, rollback.
UPD: Или ты вообще не про это? Я не совсем трезвый тут =)
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
8 утра по москве, пора уже))

я про это пусть level будет Serializable,

а ничего что между
> update codes и
> commit
у первого "thread"
произошел разрыв соеденения. запросы отдавали через вебсервис же
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
ну так пусть вебсервис состояние держит, че ему сложно чтоли )
 

WMix

герр M:)ller
Партнер клуба
как?
А если нет, то 2pc-семантика реализуется на стороне вебсервиса. Со стороны клиента-то все равно, как это реализовано, главное - выглядит, как 2pc.
в реальности происходит
PHP:
try{
  $ws->begin_2pc($trans_id);
  $nr = $ws->getPotageStamp($trans_id);
  // ...
  $ws->commit_2pc($trans_id);
}
catch( x3Exeption $e ){
  $ws->rollback_2pc($trans_id);
}
 
Последнее редактирование:
Сверху