Check what has been done for a uncommitted prepared transaction

Started by Andy Fanalmost 6 years ago7 messagesgeneral
Jump to latest
#1Andy Fan
zhihui.fan1213@gmail.com

Hi:

I want to know what happens been done for an uncommitted prepared
transaction with pg_waldump, however I can't find it.

demo=# begin;
BEGIN
demo=*# select txid_current();
txid_current
--------------
608
(1 row)

demo=*# prepare transaction 's';
PREPARE TRANSACTION
demo=# insert into mm select generate_series(1, 1000);
INSERT 0 1000
demo=#

===

pg_wal> ~/postgres/bin/pg_waldump 00000001000000000000008F | grep 'tx:
608'
rmgr: Transaction len (rec/tot): 138/ 138, tx: 608, lsn:
0/8F68C020, prev 0/8F68BFD0, desc: PREPARE gid s: 2020-05-14
15:00:33.212997 CST

I can get the log for "prepared command" only, but nothing was found for
the insert
statement. what should I do?

My version is 9.4.

Thanks

#2Andy Fan
zhihui.fan1213@gmail.com
In reply to: Andy Fan (#1)
Re: Check what has been done for a uncommitted prepared transaction

On Thu, May 14, 2020 at 3:38 PM Andy Fan <zhihui.fan1213@gmail.com> wrote:

I can get the log for "prepared command" only, but nothing was found for
the insert
statement. what should I do?

My version is 9.4.

Sorry, my production version is 9.4 and my demo above is v12. I tried in

9.4, I still have
troubles to get the logs.

Thanks

#3Michael Paquier
michael@paquier.xyz
In reply to: Andy Fan (#1)
Re: Check what has been done for a uncommitted prepared transaction

On Thu, May 14, 2020 at 03:38:24PM +0800, Andy Fan wrote:

I want to know what happens been done for an uncommitted prepared
transaction with pg_waldump, however I can't find it.

demo=*# prepare transaction 's';
PREPARE TRANSACTION
demo=# insert into mm select generate_series(1, 1000);
INSERT 0 1000

I can get the log for "prepared command" only, but nothing was found for
the insert statement. what should I do?

Because in your previous sequence you inserted the data after
preparing the transaction and they are part of a completely different
transaction, no?
--
Michael

#4Andy Fan
zhihui.fan1213@gmail.com
In reply to: Michael Paquier (#3)
Re: Check what has been done for a uncommitted prepared transaction

On Thu, May 14, 2020 at 4:05 PM Michael Paquier <michael@paquier.xyz> wrote:

On Thu, May 14, 2020 at 03:38:24PM +0800, Andy Fan wrote:

I want to know what happens been done for an uncommitted prepared
transaction with pg_waldump, however I can't find it.

demo=*# prepare transaction 's';
PREPARE TRANSACTION
demo=# insert into mm select generate_series(1, 1000);
INSERT 0 1000

I can get the log for "prepared command" only, but nothing was found for
the insert statement. what should I do?

Because in your previous sequence you inserted the data after
preparing the transaction and they are part of a completely different
transaction, no?

Thanks, actually I don't know how to use prepared transaction and how it
works.
I care about this because there is a long prepared transaction exists in
our customer,
and we want to know what this transaction has done(like any data it
changed).
All the things I know is the data comes from pg_prepared_xact, but it
doesn't help a lot.

Best Regards
Andy Fan

#5Laurenz Albe
laurenz.albe@cybertec.at
In reply to: Andy Fan (#4)
Re: Check what has been done for a uncommitted prepared transaction

On Thu, 2020-05-14 at 16:26 +0800, Andy Fan wrote:

Thanks, actually I don't know how to use prepared transaction and how it works.
I care about this because there is a long prepared transaction exists in our customer,
and we want to know what this transaction has done(like any data it changed).
All the things I know is the data comes from pg_prepared_xact, but it doesn't help a lot.

Idf you have the transaction ID from "pg_prepared_xact", you could check
what locks are held:

SELECT * FROM pg_locks WHERE transactionid = ...;

Than might give you a clue.

Using prepared transactions without a transaction manager that keeps track of them
and cleans up if necessary is dangerous.

Yours,
Laurenz Albe
--
+43-670-6056265
Cybertec Schönig & Schönig GmbH
Gröhrmühlgasse 26, A-2700 Wiener Neustadt
Web: https://www.cybertec-postgresql.com

#6Andy Fan
zhihui.fan1213@gmail.com
In reply to: Laurenz Albe (#5)
Re: Check what has been done for a uncommitted prepared transaction

On Thu, May 14, 2020 at 9:33 PM Laurenz Albe <laurenz.albe@cybertec.at>
wrote:

On Thu, 2020-05-14 at 16:26 +0800, Andy Fan wrote:

Thanks, actually I don't know how to use prepared transaction and how

it works.

I care about this because there is a long prepared transaction exists in

our customer,

and we want to know what this transaction has done(like any data it

changed).

All the things I know is the data comes from pg_prepared_xact, but it

doesn't help a lot.

Idf you have the transaction ID from "pg_prepared_xact", you could check
what locks are held:

SELECT * FROM pg_locks WHERE transactionid = ...;

Than might give you a clue.

Thanks a lot. this transaction only lock a transactionid lock, so I

assume there is nothing
is done in this transaction.

locktype | database | relation | page | tuple | virtualxid |
transactionid | classid | objid | objsubid | virtualtransaction | pid |
mode | granted | fastpath
---------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+------+---------------+---------+----------
transactionid | | | | | |
1181845808 | | | | -1/1181845808 | |
ExclusiveLock | t | f
(1 row)

Best Regards
Andy Fan

#7Laurenz Albe
laurenz.albe@cybertec.at
In reply to: Andy Fan (#6)
Re: Check what has been done for a uncommitted prepared transaction

On Fri, 2020-05-15 at 08:09 +0800, Andy Fan wrote:

On Thu, May 14, 2020 at 9:33 PM Laurenz Albe <laurenz.albe@cybertec.at> wrote:

On Thu, 2020-05-14 at 16:26 +0800, Andy Fan wrote:

Thanks, actually I don't know how to use prepared transaction and how it works.
I care about this because there is a long prepared transaction exists in our customer,
and we want to know what this transaction has done(like any data it changed).
All the things I know is the data comes from pg_prepared_xact, but it doesn't help a lot.

Idf you have the transaction ID from "pg_prepared_xact", you could check
what locks are held:

SELECT * FROM pg_locks WHERE transactionid = ...;

Than might give you a clue.

Thanks a lot. this transaction only lock a transactionid lock, so I assume there is nothing
is done in this transaction.

locktype | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | mode | granted | fastpath
---------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+------+---------------+---------+----------
transactionid | | | | | | 1181845808 | | | | -1/1181845808 | | ExclusiveLock | t | f
(1 row)

Looks like it, yes.
Roll it back then.

Yours,
Laurenz Albe
--
Cybertec | https://www.cybertec-postgresql.com