mysql深入学习之事务transaction相关操作

事务transaction

  1. 查询当前事务隔离级别
-- 查询
select @@ tx_isolation;
show variables like '%isolation%';

-- 以下是设置 (session 代表会话级别的设置,可以替换成global 全局)
set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session tansaction isolation level serializable;

在这里插入图片描述

  1. 查询长事务 (>60s)
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;

这里请使用root用户,其他用户可能会出现权限问题,如 Access denied; you need (at least one of) the PROCESS privilege(s) for this operation。

  1. 关闭事务自动提交;
-- 自动提交 0 关闭 1开启
select @@autocommit;
set autocommit=0;

假设我们执行 select * from user;关闭自动提交后就需要我们显示的commit/rollback,或者连接断开,否则事务将会一直执行。不推荐设置。
推荐使用begin—commit/rollback/commit work and chain(提交事务并自动启动下一个事务。)。

  • 确认是否有不必要的只读事务。有些框架会习惯不管什么语句先用 begin/commit 框起来。我见过有些是业务并没有这个需要,但是也把好几个 select 语句放到了事务中。这种只读事务可以去掉。
  1. SET MAX_EXECUTION_TIME控制sql语句的最长执行时间,避免长事务。
    监控 information_schema.Innodb_trx 表,设置长事务阈值,超过就报警 / 或者 kill;
    推荐Percona 的 pt-kill 工具。

  2. set innodb_undo_tablespaces 设置成 2(或更大的值)。如果真的出现大事务导致回滚段过大,这样设置后清理起来更方便。

猜你喜欢

转载自blog.csdn.net/weixin_41725792/article/details/109717360