模拟死锁并解决死锁

模拟并解决死锁

参考AI资料

使用idea连接数据库 并使用手动提交事务的方式去模拟
当然 也可以直接使用sql命令的方式实现手动提交事务

模拟死锁

1
2
3
4
5
6
7
8
-- 事务一

BEGIN;
-- 执行一些操作,例如更新表中的一行数据
UPDATE table_name SET column_name = 'test' WHERE column_name = 'test';
-- 尝试获取对表 1 中某行数据的排他锁
SELECT * FROM table_name_2 WHERE column_name = 1 FOR UPDATE;
COMMIT;
1
2
3
4
5
6
7
8
-- 事务二

BEGIN;
-- 执行一些操作,例如更新表中的一行数据
UPDATE table_name_2 SET column_name = 1 WHERE column_name = 1;
-- 尝试获取对表 2 中某行数据的排他锁
SELECT * FROM table_name WHERE column_name = 'test' FOR UPDATE;
COMMIT;

解决死锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- 方式一

-- 查看死锁的sql以及进程Id
select pid,query,* from pg_stat_activity where datname='iuin' and wait_event_type = 'Lock';

-- 只能杀死select 语句, 对其他语句不生效
select pg_cancel_backend('28736');
-- select,drop等各种操作
select pg_terminate_backend('25605');

-- 方式二

-- 查看对应表都有哪些锁
select locktype,pid,relation,mode,granted,* from pg_locks where relation in (select oid from pg_class where relname='table_name');
select pg_terminate_backend('进程ID');

-- 测试

-- 终止所有被激活的锁
select pg_terminate_backend(pid)
from pg_stat_activity
where state = 'active'
and pid != pg_backend_pid()
and pid in (select a.pid from pg_locks a join pg_class b on a.relation = b.oid where lower(b.relname) = 'news_content');

查看同一事物中都执行了哪些sql

参考AI回答

  • 一些第三方的扩展工具,如 pg_stat_monitor ,可以提供更详细和有针对性的事务执行信息。

pgsql当前线程数与最大线程数

PostgreSQL 最大连接数:通过 postgresql.conf 文件或 SQL 查询 SHOW max_connections; 获取。
当前连接数:通过 SQL 查询 SELECT count(*), sum(case when state = 'active' then 1 else 0 end) FROM pg_stat_activity; 获取。