@ru_python

Страница 6897 из 9768
Tishka17
30.10.2018
17:34:14
Заметка С бюлдинные го exe файлы находят в папке AppData\Local\Temp
Oo почему не в папке проекта? Ты как сборку запускаешь? go build?

Artem?
30.10.2018
17:34:49
Andrew
30.10.2018
17:35:08
Да
Зачем? Так то и больше можно

Google
Tishka17
30.10.2018
17:39:53
Я вообще вопрос не понял

Vaderoff
30.10.2018
17:51:11
Гайс вопросик. Есть бот в тг на асинхроне для обмена криптой, вся инфа о балансах хранится в бд, как быть уверенным в том что пока проводится сделка между двумя пользователями, один из этих пользователей не вывел деньги? То есть как быть увереным что после проверки if user.balance == trade.amount баланс пользователя не изменится, все же делается асинхронно ?

Vaderoff
30.10.2018
17:52:56
Tishka17
30.10.2018
17:53:04
Или select for update

Vaderoff
30.10.2018
17:55:30
Или select for update
Так про constraint понял, а что за селект фор апдейт?

LighteR
30.10.2018
17:55:33
Или select for update
Или вот так вот с lock'ом, да

LighteR
30.10.2018
17:56:14
А можно пример полного запроса?
update user_balance set balance = balance - 100 where user_id = 42

LighteR
30.10.2018
17:57:05
а что за субд?

Tishka17
30.10.2018
17:57:08
а constraint ?
А это в create table

Google
Vaderoff
30.10.2018
17:57:24
LighteR
30.10.2018
17:57:49
CREATE TABLE products ( product_no integer, name text, price numeric CONSTRAINT positive_price CHECK (price > 0) );

Tishka17
30.10.2018
17:58:02
Лучше наверно select for update, мало ли какая там ещё логика

Bogdan
30.10.2018
17:58:18
либо alter table {name table} add constraint {name constraint}...

Vaderoff
30.10.2018
17:58:30
А это в create table
Ааа, все понял, я думал это при апдейте

LighteR
30.10.2018
17:58:49
Лучше наверно select for update, мало ли какая там ещё логика
Пессимистичные локи это не всегда хорошо

Tishka17
30.10.2018
17:58:52
https://github.com/Tishka17/sber_test вот похожий кейс

Vaderoff
30.10.2018
17:58:58
Лучше наверно select for update, мало ли какая там ещё логика
Да не, впринципе с отрицательным баланс никак не работаю, думаю можно обойтись constraints

Nikolay
30.10.2018
17:59:38
Я уже много на кого досье набрал

Tishka17
30.10.2018
18:00:26
деанон
Ой да меня нагулить прям проблема

Bogdan
30.10.2018
18:02:20
у тебя тут очепятка

Tishka17
30.10.2018
18:02:30
Ой да пофиг

Там ещё и двухфазный комит не дописан

LighteR
30.10.2018
18:03:58
Да не, впринципе с отрицательным баланс никак не работаю, думаю можно обойтись constraints
Ну и важно новый баланс прям в апдейте вычислять, а не в коде. Иначе можно потерять деньги, даже если баланс будет положительным

с select for update можно и в коде

Vaderoff
30.10.2018
18:14:01
Понял, всем спасибо

Nikolay
30.10.2018
18:15:22
int 13h

Vaderoff
30.10.2018
18:15:56
Понял, всем спасибо
То есть выход: constraints на неотрицательны баланс + проверка баланса в запросе? Select for update здесь нужен?

Google
LighteR
30.10.2018
18:16:43
То есть выход: constraints на неотрицательны баланс + проверка баланса в запросе? Select for update здесь нужен?
Не проверка баланса в запросе, а вычисление нового баланса прямо в update-запросе. При такой схеме select for update не нужен

Toha
30.10.2018
18:17:54
Кстати!

А как такие ограничения делать средствами СУБД?

Триггеры?

LighteR
30.10.2018
18:18:14
CREATE TABLE products ( product_no integer, name text, price numeric CONSTRAINT positive_price CHECK (price > 0) );

Toha
30.10.2018
18:18:59
О_о

Никита
30.10.2018
18:19:16
Vaderoff
30.10.2018
18:19:27
CREATE TABLE products ( product_no integer, name text, price numeric CONSTRAINT positive_price CHECK (price > 0) );
Если при запросе мы попробуем установить отрицательный баланс, нам выдаст ошибку, а что пользователю говорить? Типо попробуйте позже ?

Никита
30.10.2018
18:19:43
Перенос части бизнес логики в хранилище - не самое лучшее решение

LighteR
30.10.2018
18:20:16
Почему это не делать в коде?
Предложите решение без пессиместичных блокировок

Никита
30.10.2018
18:21:19
Предложите решение без пессиместичных блокировок
Ну ты делаешь чек прайса в бд. зачем - непонятно

Vaderoff
30.10.2018
18:22:16
Ну ты делаешь чек прайса в бд. зачем - непонятно
Затем чтобы нельзя было установить отрицательный прайс

LighteR
30.10.2018
18:22:25
Если при запросе мы попробуем установить отрицательный баланс, нам выдаст ошибку, а что пользователю говорить? Типо попробуйте позже ?
Да, будет ошибка. При ошибке можно снова проверить баланс пользователя и если он действительно недостаточный показать пользователю соответствующую ошибку. Но в любом случае, даже если забыть сделать обработку ошибки, то лучше пускай будет 500ка, чем баланс придет в неконсистентность

Никита
30.10.2018
18:22:39
Затем чтобы нельзя было установить отрицательный прайс
повторю вопрос - почему это не делать в бизнес логике приложения?

Никита
30.10.2018
18:23:05
У вас что, данные сразу в базу приходят?

LighteR
30.10.2018
18:23:23
нет

приведи пример (можно на псевдоязыке) как будет выглядеть списание с пользователя определенной суммы

Toha
30.10.2018
18:23:53
На моем последнем проекте я ввел поле balance в сущность "кошелек"

На что мне сказали - "аяяй" так делать

Google
Toha
30.10.2018
18:24:21
Баланс должен высчитываться всегда из транзакций

И если нужно скорости - кешировать его

Vaderoff
30.10.2018
18:24:40
У вас что, данные сразу в базу приходят?
Я могу их обработать до попадания в бд, но где гарантия того что при асинхронных запросах пока делается проверка баланс не изменится ?

Toha
30.10.2018
18:25:30
Баланс должен высчитываться всегда из транзакций
типа иначе неконсистентность данных будет

Vaderoff
30.10.2018
18:26:27
типа иначе неконсистентность данных будет
Ну, парни выше написали что можно делать блокировку строк, но еще написали что это плохо

Admin
ERROR: S client not available

LighteR
30.10.2018
18:26:28
Ну, парни выше написали что можно делать блокировку строк, но еще написали что это плохо
Ну это не то чтобы плохо. Но в определенных кейсах может быть неприемлемо

Toha
30.10.2018
18:27:01
Да мне кажется норм тема с кешированием баланса

Никита
30.10.2018
18:27:18
при чем здесь SSI вообще?
это лучше чем пессиместичные блокировки

Toha
30.10.2018
18:27:19
и не хранить его в кошельке

LighteR
30.10.2018
18:27:30
Да мне кажется норм тема с кешированием баланса
ну считай, что поле balance в кошельке это и есть кэш

Никита
30.10.2018
18:27:31
LighteR
30.10.2018
18:28:17
так и стоит делать в принципе
Как это решит проблему с возможным получением отрицательного баланса?

Vaderoff
30.10.2018
18:28:29
Никита
30.10.2018
18:29:03
LighteR
30.10.2018
18:29:51
окей. как он может получиться в этом случае?
не, чувак, погоди. Ты набросил тему, что constraint'ы в базе это зло, и проверку надо делать в коде. Я тебя попросил привести пример как эта проверка будет выглядеть

давай сначала с этим разберемся

Никита
30.10.2018
18:31:33
не, чувак, погоди. Ты набросил тему, что constraint'ы в базе это зло, и проверку надо делать в коде. Я тебя попросил привести пример как эта проверка будет выглядеть
я сначала неправильно понял проблему. Потом в замен тем же пессиместичным блокировкам предложил SSI. При SSI не возникнет ситуации с отрицательным кошельком.

Google
Toha
30.10.2018
18:31:50
что такое SSI?

LighteR
30.10.2018
18:33:43
Serializable Snapshot isolation
оу, а я подумал что ты про тот самый древний SSI (https://en.wikipedia.org/wiki/Server_Side_Includes)

LighteR
30.10.2018
18:35:24
ахах
да, я аж чаем подавился ))

Vaderoff
30.10.2018
18:36:24
Serializable Snapshot isolation
Можешь вкратце описать что это и как работает?

Toha
30.10.2018
18:37:26
Типа, не дает закоммитить транзакцию

Если до коммита был выполнен коммит в другой транзакции

если я правильно понел

Никита
30.10.2018
18:38:11
Да

Toha
30.10.2018
18:38:16
да

Прикольная штука, ннада будет изучить ее глубже. Мне это пригодится

получается, в таких случаях выполнять подобного рода операции нужно в цикле?

типа в декоратор какой нить обернуть

Страница 6897 из 9768