#atomic #deepstream.io
#атомарный #deepstream.io
Вопрос:
Не могли бы вы сказать мне, выполняется ли RPC атомарно?
Например, при совершении транзакции между двумя учетными записями у меня был бы такой RPC:
1. client.rpc.provide('xfer', (data, response) => {
2. var srcWallet = getRecord(data.srcWalletId);
3. var dstWallet = getRecord(data.dstWalletId);
4. if (srcWallet.get('balance') >= data.xferAmount) {
5. srcWallet.set('balance', srcWallet.get('balance') - xferAmount);
6. dstWallet.set('balance', dstWallet.get('balance') xferAmount);
7. }
Точно ли, что баланс srcWallet не может измениться между строками 4 и 5?
Ответ №1:
Просто чтобы уточнить: deepstream выполняет RPC (запрос / ответ) с использованием ds.rpc.make/ds.rpc.provide , ваш пример относится к записям.
Приведенный выше пример будет временно работать для однопоточных реализаций JavaScript, однако вы не можете быть уверены, что на пути к клиенту не будет входящей транзакции, которая изменит баланс кошелька. Для обеспечения соблюдения правил, подобных приведенным выше, используйте правило Valve на сервере, например
_('src-wallet').balance >= data.xferAmount
Пожалуйста, найдите больше на
https://deepstream.io/tutorials/core/permission-conf-simple/
https://deepstream.io/tutorials/core/permission-conf-advanced/
https://deepstream.io/tutorials/core/permissions-dynamic/
Комментарии:
1. Я пропустил RPC, приведенный выше для краткости, я спрашиваю, потому что на странице RPC ( deepstream.io/tutorials/core/request-response-rpc ) в нем упоминается «Безопасное объединение многоступенчатых транзакций записей», из вашего ответа кажется, что это верно только для одного поставщика RPC в одном потоке?