缺点
- 长事务会导致系统存在古老视图,提交前其undolog都必须保留,会占用大量存储空间。
事务启动方式
显式启动事务语句
需要手动提交。
begin 或 start transaction。回滚语句是 rollback;执行commit 则提交事务;执行 commit work and chain,则是提交事务并自动启动下一个事务,这样也省去了再次执行 begin 语句的开销,同时带来的好处是从程序开发的角度明确地知道每个语句是否处于事务中。
非显式开启的事务
需要看autocommit参数,0需要手动提交,1自动提交。
set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。
建议使用set autocommit=1,通过显式语句的方式来启动事务。
查询长事务
information_schema 库的 innodb_trx 这个表中查询长事务,比如下面这个语句,用于查找持续时间超过 60s 的事务。
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60
长事务处理
- 通过information_schema.innodb_trx表监控事务的持续时间
- 增加undo表空间
- 通过配置参数max_execution_time指定事务执行的最长时间
- 利用pt工具监控长事务。