`
san_yun
  • 浏览: 2652559 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

MySQL的wait_timeout参数太小导致表级锁失效

 
阅读更多

如果想让某个表只读不能被修改,可以在MySQL Server层面加表级锁:

mysql> lock tables sms read;
Query OK, 0 rows affected (0.01 sec)

然后其他的连接去更新或插入数据是不会成功的:

mysql> insert into sms(id) values (555);

因为要等待表级锁的释放,可以通过processlist看到这一点:

mysql> show processlist;
+--------+-------------+---------------------+---------------+---------+------+-------------------------------------------+-----------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+-------------+---------------------+---------------+---------+------+-------------------------------------------+-----------------------------------------+ |
| 364733 | root | localhost | banpingdb | Query | 0 | NULL | show processlist |
| 364734 | root | localhost | banpingdb | Query | 148 | Waiting for table level lock | insert into sms(id) values (555) |
+--------+-------------+---------------------+---------------+---------+------+-------------------------------------------+-----------------------------------------+
2 rows in set (0.00 sec)

当然,更详细的信息也可以看到:

mysql> show engine innodb status \G
------------
TRANSACTIONS
------------
Trx id counter 5AA0D8A
Purge done for trx's n:o < 5AA0D77 undo n:o < 0
History list length 1063
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0, not started, process no 21967, OS thread id 1286076736
mysql tables in use 1, locked 1
MySQL thread id 364734, query id 3527582 localhost root Waiting for table level lock
insert into sms(id) values (555)
---TRANSACTION 0, not started, process no 21967, OS thread id 1284471104
mysql tables in use 1, locked 1
MySQL thread id 364733, query id 3527604 localhost root
show engine innodb status

但是,今天奇怪的发现,在等待了一段时间后,insert语句竟然莫名其妙的成功了,分析了一下原因。并没有什么地方控制表级锁的超时,就是因为表级锁被释放了,才能使得insert成功,而表级锁被释放的源头就是wait_timeout参数,这个参数的意思是:

The number of seconds the server waits for activity on a noninteractive connection before closing it.

如果这个值设置的小,比如说一分钟,那么一分钟后,不活动的连接就会被释放,而连接的释放会导致这个连接发出的表级锁被解锁。如果你的系统里这个参数很小,下面的这些信息一定是你经常看到的:

ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 364743
Current database: banpingdb

这个错误提示的就是连接超时了重新连的意思。
还有另外一个参数是interactive_timeout,是针对interactive connection的超时时间,但是在global层面设置这个值会引起wait_timeout的连带改变。

分享到:
评论

相关推荐

    MySQL数据库连接超时(Wait_timeout)问题总结.pdf

    总之,MySQL的连接超时问题主要是由`wait_timeout`参数引发的,解决方法包括但不限于调整MySQL服务器配置、使用连接池、更新应用程序代码以处理连接失效的情况,以及在使用ORM框架时,按照框架的文档配置相应的连接...

    javaee mysql空闲关闭

    然而,为了优化资源使用,MySQL配置了一个参数`wait_timeout`,这个参数定义了连接在空闲多长时间后会被自动关闭。当JavaEE应用中的数据库连接在超过这个设定的时间没有执行任何操作,MySQL服务器会断开这个连接,这...

    如何修改mysql数据库的max_allowed_packet参数

    当传输的数据包超过了`max_allowed_packet`设定的值,MySQL会拒绝接收,从而导致诸如"Got a packet bigger than 'max_allowed_packet' bytes"或"MySQL server has gone away"这类错误。 当遇到这些错误时,通常需要...

    mysql.docx

    本篇将详细探讨`max_allowed_packet`参数和`show profiles`功能,以及`wait_timeout`设置对MySQL性能的影响。 `max_allowed_packet`参数用于控制MySQL服务器接收或发送的最大数据包大小。默认情况下,这个值可能...

    mysql 异常com.mysql.jdbc.CommunicationsException

    ### MySQL异常...通过适当调整MySQL服务器的`wait_timeout`配置或C3P0连接池的相关参数,可以有效地解决此类问题。在实际操作过程中,还需要根据具体的业务场景选择合适的配置方案,以达到最佳的效果。

    mysql数据库my.cnf配置文件

    innodb_lock_wait_timeout = 120 # InnoDB事务在被回滚之前可以等待一个锁定的超时秒数。InnoDB在它自己的锁定表中自动检测事务死锁并且回滚事务。InnoDB用LOCK TABLES语句注意到锁定设置。默认值是50秒 bulk_insert...

    Mysql经典的“8小时问题”

    MySQL在空闲连接达到一定时间(默认8小时,即`wait_timeout`参数设定的时间)后会自动断开这些连接,以节省系统资源。然而,一些连接池如c3p0可能没有及时检测到这种变化,仍尝试使用已被MySQL断开的连接,导致应用...

    Django数据库连接丢失问题的解决方法

    问题 在Django中使用mysql偶尔会出现数据库连接丢失的情况,错误通常有如下两种 ...如果客户端使用一个连接查询多次数据库,如果连续查询则没有问题,如果查询几次后停顿超过wait_timeout后再次查询就会出

    MySQL架构与内部模块学习笔记

    长连接可以在多个操作之间重用,但长时间无活动的连接会被断开,可通过`interactive_timeout`和`wait_timeout`变量设置超时时间。默认最大连接数为151,最大可设置为16384。可以通过`SHOW FULL PROCESSLIST`命令查看...

    PHP中使用sleep造成mysql读取失败的案例和解决方法

    这个超时时间通常由服务器配置的`wait_timeout`参数决定,不同的MySQL服务器配置可能不同,但通常是几分钟到几个小时不等。 在案例中,由于使用了单例模式的数据库操作类,数据库连接在第一次读取数据后保持打开...

    MySQL server has gone away 问题的解决方法

    MySQL服务器设置了一定的超时时间,如果在 `wait_timeout` 参数设定的时间内没有收到新的请求,连接会被自动关闭。默认的 `wait_timeout` 值为28800秒,即8小时。你可以通过 `show global variables like '%timeout'...

    mysql性能优化-慢查询分析、优化索引和配置.doc

    3. `interactive_timeout`和`wait_timeout`: 分别设置交互式会话和非交互式会话超时时间,防止长时间无活动的连接占用资源。 4. `key_buffer_size`: 用于MyISAM表的索引缓存,应根据表的大小适当调整。 5. `query_...

    c3p0 重新自动连接c3p0 重新自动连接c3p0 重新自动连接c3p0 重新自动连接

    - **调整 MySQL 的 wait_timeout 参数**:将其设置为更长的时间或者根据应用需求进行调整。 - **调整 c3p0 的 maxIdleTime 和 idleConnectionTestPeriod 参数**:确保这些参数设置得当,以便c3p0能够在MySQL关闭空闲...

    MySql数据库使用Sql调优

    `show processlist`可以查看当前的连接状态,`wait_timeout`参数控制无活动连接的断开时间,默认为8小时。 2. **查询缓存**:MySQL在执行查询前会先检查缓存,如果找到匹配的SQL和结果,就直接返回。然而,由于查询...

    一条Sql的执行过程.doc

    在MySQL中,如果连接保持时间过长,可能会占用过多资源,因此需要合理设置`wait_timeout`等参数来管理连接。 2. **查询缓存**:在MySQL的早期版本中,如果查询缓存开启且未被禁用,服务器会检查这个查询是否之前...

    Spring Boot 配置MySQL数据库重连的操作方法

    is longer than the server configured value of 'wait_timeout'. 二、解决连接超时问题 要解决连接超时问题,我们可以在连接 URL 上添加 autoReconnect=true 来解决。例如: jdbc:mysql://localhost:3306/test?...

    Java常见异常集-Java,Hibernate,Tomcat异常

    12. **Lock wait timeout exceeded try restarting transaction**:在MySQL中,如果事务等待锁的时间超过设定的超时时间,会出现此错误。分析事务逻辑,优化事务粒度,或者提高锁等待超时时间(innodb_lock_wait_...

    java数据库之sql优化

    - `wait_timeout`:设置空闲连接的最大生存时间。可以根据应用场景适当调整,例如减少默认的8小时到半小时。 - `max_user_connections`:设置最大用户连接数,以避免资源过度消耗。 - `thread_concurrency`:设置...

Global site tag (gtag.js) - Google Analytics