FANZA同人の男性向け作品一覧の大幅割引作品の検索サイトは、以下のようなSQLでデータを流し込んでいます。
そこで新たにターミナルを立ち上げて上記SQLを流し込もうとしたところトランザクションがロールバックされていないため、テーブルにロックが入ってSQLが実行待ちになってしまいました。
あー、ロックを強制的に外さないと駄目かなあ…、そもそもロックの確認方法を忘れている…といろいろ調べているうちに自然にロックが解除され(セッションが切れてから一定時間立つとロールバックされるのかな…)実行待ち状態は解除されました。
ロックの確認とロックしているプロセスの解放方法の確認に時間がかかったのでメモしておきます。
ロックの確認方法
PREPARE fanza_doujin_sales_plan (
text
, text
, integer
, text
, integer
, integer
, text
, text
, integer
, timestamp with time zone
, date
, integer
) AS
INSERT INTO fanza_doujin_sales (
cid
, title
, maker_id
, maker_name
, price
, discount_rate
, img
, genre
, number_of_sales
, campaign_due_date
, delivery_start_date
, number_of_pages
) VALUES ( $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12 )
ON CONFLICT (cid, campaign_due_date)
DO UPDATE SET price = $5, discount_rate = $6
RETURNING cid, title, (xmax = 0) AS inserted;
;
EXECUTE fanza_doujin_sales_plan(
'd_243614'
, '使用済みの姪っ子を俺の女に染めるまで'
, 75096
, 'あまいちご'
, 192
, 75
, 'https://doujin-assets.dmm.co.jp/digital/comic/d_243614/d_243614pl.jpg'
, 'コミック'
, 85465
, '2023/10/16'
, '2022/09/30'
, 24
);
ある日、BEGINを実行した後に上記SQLを流し込んでいる最中にターミナルのセッションが切れてしまいました。そこで新たにターミナルを立ち上げて上記SQLを流し込もうとしたところトランザクションがロールバックされていないため、テーブルにロックが入ってSQLが実行待ちになってしまいました。
あー、ロックを強制的に外さないと駄目かなあ…、そもそもロックの確認方法を忘れている…といろいろ調べているうちに自然にロックが解除され(セッションが切れてから一定時間立つとロールバックされるのかな…)実行待ち状態は解除されました。
ロックの確認とロックしているプロセスの解放方法の確認に時間がかかったのでメモしておきます。
ロックの確認方法
SELECT
l.relation::regclass,
l.locktype,
l.mode,
l.granted,
a.pid,
a.query
FROM
pg_locks l
JOIN
pg_stat_activity a
ON
l.pid = a.pid
WHERE
l.relation = 'fanza_doujin_sales'::regclass;
ap2=# SELECT
l.relation::regclass,
l.locktype,
l.mode,
l.granted,
a.pid,
a.query
FROM
pg_locks l
JOIN
pg_stat_activity a
ON
l.pid = a.pid
WHERE
l.relation = 'fanza_doujin_sales'::regclass;
relation | locktype | mode | granted | pid | query
--------------------+----------+------------------+---------+---------+-----------------------------------------------------------------------------
fanza_doujin_sales | relation | RowExclusiveLock | t | 3190875 | EXECUTE fanza_doujin_sales_plan( +
| | | | | 'd_243614' +
| | | | | , '使用済みの姪っ子を俺の女に染めるまで' +
| | | | | , 75096 +
| | | | | , 'あまいちご' +
| | | | | , 192 +
| | | | | , 75 +
| | | | | , 'https://doujin-assets.dmm.co.jp/digital/comic/d_243614/d_243614pl.jpg'+
| | | | | , 'コミック' +
| | | | | , 85465 +
| | | | | , '2023/10/16' +
| | | | | , '2022/09/30' +
| | | | | , 24 +
| | | | | );
(1 row)
プロセスの強制終了ap2=# select pg_terminate_backend(3190875) ;
pg_terminate_backend
----------------------
t
(1 row)
ap2=# SELECT
l.relation::regclass,
l.locktype,
l.mode,
l.granted,
a.pid,
a.query
FROM
pg_locks l
JOIN
pg_stat_activity a
ON
l.pid = a.pid
WHERE
l.relation = 'fanza_doujin_sales'::regclass;
relation | locktype | mode | granted | pid | query
----------+----------+------+---------+-----+-------
(0 rows)
pg_cancel_backendだとプロセスを殺すことができませんでした。
ap2=# select pg_cancel_backend(3191875) ;
pg_cancel_backend
-------------------
t
(1 row)
ap2=# SELECT
l.relation::regclass,
l.locktype,
l.mode,
l.granted,
a.pid,
a.query
FROM
pg_locks l
JOIN
pg_stat_activity a
ON
l.pid = a.pid
WHERE
l.relation = 'fanza_doujin_sales'::regclass;
relation | locktype | mode | granted | pid | query
--------------------+----------+------------------+---------+---------+-----------------------------------------------------------------------------
fanza_doujin_sales | relation | RowExclusiveLock | t | 3191875 | EXECUTE fanza_doujin_sales_plan( +
| | | | | 'd_243614' +
| | | | | , '使用済みの姪っ子を俺の女に染めるまで' +
| | | | | , 75096 +
| | | | | , 'あまいちご' +
| | | | | , 192 +
| | | | | , 75 +
| | | | | , 'https://doujin-assets.dmm.co.jp/digital/comic/d_243614/d_243614pl.jpg'+
| | | | | , 'コミック' +
| | | | | , 85465 +
| | | | | , '2023/10/16' +
| | | | | , '2022/09/30' +
| | | | | , 24 +
| | | | | );
(1 row)