Mysql事物阻塞的实现
作者:be.be
阻塞因为不同锁之间的兼容性关系,在有些时刻一个事务中的锁需要等待另一个事务中的锁释放它所占用的资源,这就是阻塞。
阻塞并不是一件坏事,其是为了确保事务可以并发且正常地运行。在InnoDB存储引擎中,参数innodb_lock_wait_timeout用来控制等待的时间(默认是50秒),innodb_rollback_on_timeout用来设定是否在等待超时时对进行中的事务进行回滚操作(默认是OFF,代表不回滚)。参数innodb_lock_wait_timeout是动态的,可以在MySQL数据库运行时进行调整而innodb_rollback_on_timeout是静态的,不可在启动时进行修改,当发生超时,MySQL数据库会抛出一个1205的错误,需要牢记的是,在默认情况下InnoDB存储引擎不会回滚超时引发的错误异常。其实InnoDB存储引擎在大部分情况下都不会对异常进行回滚。
1、查看现有事物(锁),批量生成 kill 命令
select CONCAT('kill ', trx_mysql_thread_id, ';') as kill_command, a.* from information_schema.innodb_trx as a -- where trx_query is null
2、查看指定数据库的线程,及其对应的事物(锁),批量生成 kill 命令
select CONCAT('kill ', trx_mysql_thread_id, ';') as kill_command, a.*, b.* from information_schema.processlist as a left join information_schema.innodb_trx as b -- join information_schema.innodb_trx as b on a.id = b.trx_mysql_thread_id where a.db = 'my_db' -- and b.trx_query is null
3、查看事务超时时间
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
lock_wait_timeout 是一个服务器级别的参数,它用于设置所有连接在等待行级锁或表级锁时可以等待的最大时间。当连接等待的时间超过了 lock_wait_timeout 的值时,MySQL 将抛出一个错误,并终止连接。默认值为 31536000 秒(即一年)。
innodb_lock_wait_timeout 是一个存储引擎级别的参数,它仅用于设置使用 InnoDB 存储引擎的连接在等待行级锁或表级锁时可以等待的最大时间。当连接等待的时间超过了 innodb_lock_wait_timeout 的值时,InnoDB 将抛出一个错误,并终止连接。默认值为 50 秒。
建议将 innodb_lock_wait_timeout 的值设置得比较小,因为这可以有效避免因等待锁而导致的超时问题。但是,也要注意不要设置得过小,以免在高并发的情况下出现频繁的超时错误。
到此这篇关于Mysql事物阻塞的实现的文章就介绍到这了,更多相关Mysql事物阻塞内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!