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)