public inbox for [email protected]
help / color / mirror / Atom feedFrom: Hui Jackson <[email protected]>
To: [email protected]
To: [email protected]
Cc: [email protected]
Subject: Re: Using Transaction with if-else in prepared statement
Date: Thu, 26 May 2022 18:00:49 +0800
Message-ID: <CAHXAyjyHmMqF=uUyk1enfTynGfU6ZbZviD-QSMCt7eL9x_p1Tg@mail.gmail.com> (raw)
In-Reply-To: <[email protected]>
References: <CAHXAyjx-2MhO0zoCt3Vr_2AW6sFVjN0tgDo_GPVg=DVCzQDQMQ@mail.gmail.com>
<[email protected]>
Concluded both methods shared:
1. one query per each call for using prepared statement
await pgPool.query('BEGIN;');
const sender = (await pgPool.query('SELECT coin from app_user where id =
$1;',[senderId])).rows[0];
if(sender.coin >= amount){
await pgPool.query('UPDATE app_user set coin = coin - $1 where id = $2;',[
coin, senderId]);
await pgPool.query('UPDATE app_user set coin = coin + $1 where id = $2;',[
coin, receiverId]);
await pgPool.query('INSERT INTO coin_history(sender_id, receiver_id,
amount) VALUES ($1, $2, $3)',[senderId, receiverId, coin]);
await pgPool.query('COMMIT;');
}else{
await pgPool.query('END;');
}
2. Use constraint
CREATE TABLE app_user(
id integer,
coin numeric CHECK (coin >= 0)
);
hubert depesz lubaczewski <[email protected]> 於 2022年5月26日週四 上午7:35寫道:
> On Wed, May 25, 2022 at 07:12:49PM +0800, Hui Jackson wrote:
> > I am trying to make transaction in nodejs
> > The logic will be check if sufficient coin in sender's amount, if
> > sufficient then do transaction.
> > I am new to postgres, not sure if this is a right way to do so, if you
> have
> > a better solution, please let me know, thank you.
>
> I would do i by issuing *only*
> INSERT INTO coin_history(sender_id, receiver_id, amount) VALUES
> and then changing coin data with triggers plus adding constraints that
> app_user.coin can never be < 0.
>
> depesz
>
view thread (4+ messages)
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected], [email protected], [email protected]
Subject: Re: Using Transaction with if-else in prepared statement
In-Reply-To: <CAHXAyjyHmMqF=uUyk1enfTynGfU6ZbZviD-QSMCt7eL9x_p1Tg@mail.gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox