鱼C论坛

 找回密码
 立即注册
查看: 136|回复: 4

[已解决]这个锁等待超时是什么意思啊

[复制链接]
发表于 2024-3-26 12:25:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #连接设置
  2. driverClassName=com.mysql.jdbc.Driver
  3. url=jdbc:mysql://localhost:3306/jdbcStudy?
  4. useUnicode=true&characterEncoding=utf8&useSSL=true
  5. username=root
  6. password=18870025610
  7. #<!-- 初始化连接 -->
  8. initialSize=10
  9. #最大连接数量
  10. maxActive=50
  11. #<!-- 最大空闲连接 -->
  12. maxIdle=20
  13. #<!-- 最小空闲连接 -->
  14. minIdle=5
  15. #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
  16. maxWait=60000
  17. #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
  18. #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
  19. 3、编写工具类 JdbcUtils_DBCP
  20. connectionProperties=useUnicode=true;characterEncoding=UTF8
  21. #指定由连接池所创建的连接的自动提交(auto-commit)状态。
  22. defaultAutoCommit=true
  23. #driver default 指定由连接池所创建的连接的只读(read-only)状态。
  24. #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:
  25. Informix)
  26. defaultReadOnly=
  27. #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
  28. #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED,REPEATABLE_READ, SERIALIZABLE
  29. defaultTransactionIsolation=READ_UNCOMMITTED
复制代码


这个是配置文件

  1. package zwl.lesson5;

  2. import com.mysql.jdbc.JDBC4UpdatableResultSet;
  3. import org.apache.commons.dbcp.BasicDataSource;
  4. import org.apache.commons.dbcp.BasicDataSourceFactory;

  5. import javax.sql.DataSource;
  6. import java.io.InputStream;
  7. import java.sql.*;
  8. import java.util.Properties;

  9. public class jdbcUtils_pool {
  10.     private static DataSource ds =null;

  11.     static {
  12.         try {
  13.             InputStream in = jdbcUtils_pool.class.getClassLoader().getResourceAsStream("dbconfig.properties");

  14.             Properties properties = new Properties();
  15.             properties.load(in);

  16.             ds = BasicDataSourceFactory.createDataSource(properties);

  17.         } catch (Exception e) {
  18.             e.printStackTrace();
  19.         }
  20.     }

  21.     //获取连接 DriverManager.getConnection(url, username, password);
  22.     public static Connection getConnection() throws SQLException {
  23.         return ds.getConnection();
  24.     }

  25.     //释放资源
  26.     public static void release( Connection coon,Statement st, ResultSet re) {
  27.         if (re != null) {
  28.             try {
  29.                 re.close();
  30.             } catch (Exception e) {
  31.                 e.printStackTrace();
  32.             }

  33.         }
  34.         if (st != null) {
  35.             try {
  36.                 st.close();
  37.             } catch (SQLException e) {
  38.                 e.printStackTrace();
  39.             }
  40.         }
  41.         if (coon != null) {
  42.             try {
  43.                 coon.close();
  44.             } catch (SQLException e) {
  45.                 e.printStackTrace();
  46.             }
  47.         }
  48.     }
  49. }
复制代码
  1. package zwl.lesson5;

  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;

  6. public class TextPool {
  7.     public static void main(String[] args) {
  8.         Connection conn=null;
  9.         PreparedStatement st=null;
  10.         ResultSet rs=null;
  11.         try {
  12.             conn= jdbcUtils_pool.getConnection();

  13.             String sql="INSERT INTO `users`(`id`,`NAME`,`PASSWORD`) VALUE(?,?,?)";
  14.             st=conn.prepareStatement(sql);

  15.             st.setInt(1,5);
  16.             st.setString(2,"kuangsheng");
  17.             st.setString(3,"334223");

  18.             int i=st.executeUpdate();

  19.             if(i>0)
  20.             {
  21.                 System.out.println("插入成功");
  22.             }

  23.         } catch (SQLException e) {
  24.             e.printStackTrace();
  25.         }finally {
  26.             jdbcUtils_pool.release(conn,st,rs);
  27.         }
  28.     }
  29. }
复制代码
  1. E:\JAVAJDK\bin\java.exe "-javaagent:E:\IDEA Community\IntelliJ IDEA Community Edition 2021.3.1\lib\idea_rt.jar=62489:E:\IDEA Community\IntelliJ IDEA Community Edition 2021.3.1\bin" -Dfile.encoding=UTF-8 -classpath "E:\JAVAJDK\jre\lib\charsets.jar;E:\JAVAJDK\jre\lib\deploy.jar;E:\JAVAJDK\jre\lib\ext\access-bridge-64.jar;E:\JAVAJDK\jre\lib\ext\cldrdata.jar;E:\JAVAJDK\jre\lib\ext\dnsns.jar;E:\JAVAJDK\jre\lib\ext\jaccess.jar;E:\JAVAJDK\jre\lib\ext\jfxrt.jar;E:\JAVAJDK\jre\lib\ext\localedata.jar;E:\JAVAJDK\jre\lib\ext\nashorn.jar;E:\JAVAJDK\jre\lib\ext\sunec.jar;E:\JAVAJDK\jre\lib\ext\sunjce_provider.jar;E:\JAVAJDK\jre\lib\ext\sunmscapi.jar;E:\JAVAJDK\jre\lib\ext\sunpkcs11.jar;E:\JAVAJDK\jre\lib\ext\zipfs.jar;E:\JAVAJDK\jre\lib\javaws.jar;E:\JAVAJDK\jre\lib\jce.jar;E:\JAVAJDK\jre\lib\jfr.jar;E:\JAVAJDK\jre\lib\jfxswt.jar;E:\JAVAJDK\jre\lib\jsse.jar;E:\JAVAJDK\jre\lib\management-agent.jar;E:\JAVAJDK\jre\lib\plugin.jar;E:\JAVAJDK\jre\lib\resources.jar;E:\JAVAJDK\jre\lib\rt.jar;C:\Users\a2032\Desktop\JAVA cod\zwl\out\production\zwl;C:\Users\a2032\Desktop\JAVA cod\zwl\lib\commons-dbcp-1.4.jar;C:\Users\a2032\Desktop\JAVA cod\zwl\lib\commons-pool-1.6.jar;C:\Users\a2032\Desktop\JAVA cod\zwl\lib\mysql-connector-java-5.1.47.jar" zwl.lesson5.TextPool
  2. com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
  3.         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  4.         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  5.         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  6.         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
  7.         at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
  8.         at com.mysql.jdbc.Util.getInstance(Util.java:408)
  9.         at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:952)
  10.         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3978)
  11.         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3914)
  12.         at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)
  13.         at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)
  14.         at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2495)
  15.         at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1903)
  16.         at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2124)
  17.         at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2058)
  18.         at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5158)
  19.         at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2043)
  20.         at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
  21.         at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
  22.         at zwl.lesson5.TextPool.main(TextPool.java:23)

  23. Process finished with exit code 0
复制代码

捕获.PNG
这个是我的文件目录结构,不知道哪里错了
最佳答案
2024-3-26 12:25:33
从错误信息来看,你遇到了一个`com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction`的异常。这个异常表示在执行数据库事务时,等待锁的时间超过了设定的超时时间。

通常情况下,这个异常出现的原因是由于并发操作导致的。在你的代码中,你执行了一条插入语句`INSERT INTO users (id, NAME, PASSWORD) VALUE(?,?,?)`,如果在同一时刻有其他线程或者连接也在访问该表,可能会导致锁等待超时的问题。

解决这个问题的方法可以有以下几种:

1. 增加等待时间:可以尝试增加`maxWait`属性的值,从当前配置来看,`maxWait`设置为60000,即60秒。你可以将其增加到更大的值,比如120秒,来给其他连接更多的时间来释放锁。

2. 优化查询语句:检查并优化你的查询语句,确保只锁定必要的行和表,减少锁定时间。

3. 使用隔离级别:将数据库的隔离级别设置为更高的级别(如`READ_COMMITTED`)可以减少锁等待时间。

4. 重新设计数据表结构:如果锁等待问题经常发生,可能需要重新设计数据表结构,以减少并发操作导致的锁等待。

另外,关于你提供的代码和文件目录结构,我没有看到明显的问题。如果你能提供更多的错误信息或者日志,我可以帮你更具体地定位问题所在。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-26 12:25:33 | 显示全部楼层    本楼为最佳答案   
从错误信息来看,你遇到了一个`com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction`的异常。这个异常表示在执行数据库事务时,等待锁的时间超过了设定的超时时间。

通常情况下,这个异常出现的原因是由于并发操作导致的。在你的代码中,你执行了一条插入语句`INSERT INTO users (id, NAME, PASSWORD) VALUE(?,?,?)`,如果在同一时刻有其他线程或者连接也在访问该表,可能会导致锁等待超时的问题。

解决这个问题的方法可以有以下几种:

1. 增加等待时间:可以尝试增加`maxWait`属性的值,从当前配置来看,`maxWait`设置为60000,即60秒。你可以将其增加到更大的值,比如120秒,来给其他连接更多的时间来释放锁。

2. 优化查询语句:检查并优化你的查询语句,确保只锁定必要的行和表,减少锁定时间。

3. 使用隔离级别:将数据库的隔离级别设置为更高的级别(如`READ_COMMITTED`)可以减少锁等待时间。

4. 重新设计数据表结构:如果锁等待问题经常发生,可能需要重新设计数据表结构,以减少并发操作导致的锁等待。

另外,关于你提供的代码和文件目录结构,我没有看到明显的问题。如果你能提供更多的错误信息或者日志,我可以帮你更具体地定位问题所在。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-26 12:45:24 | 显示全部楼层
FishC 发表于 2024-3-26 12:25
从错误信息来看,你遇到了一个`com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock ...

我等了很久但是还是没用,我现在从sqlyog去删除这个id=5的数据也会报这个错,但是我一个时间只执行了一个数据,应该不是并发导致的吧,我没有多调用哇
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-26 12:45:41 | 显示全部楼层
孤世星辰 发表于 2024-03-26 12:45
我等了很久但是还是没用,我现在从sqlyog去删除这个id ...


如果你在执行单个插入语句时就遇到了锁等待超时的问题,并且没有并发调用的情况,那可以考虑以下几点:

1. 数据库配置问题:检查数据库的配置文件,确保没有设置不合理的超时时间或其他限制。特别注意检查`innodb_lock_wait_timeout`参数,该参数定义了InnoDB存储引擎的锁等待超时时间,可以尝试将其调大。

2. 数据库表结构问题:检查数据表的索引和约束,确保它们能够有效地支持并发操作。有时候索引过少或者过多,或者约束设计不当也会导致锁等待的问题。

3. 数据库性能问题:检查数据库服务器的性能,确保其资源充足,并且没有其他操作导致了性能瓶颈。例如,磁盘IO、CPU和内存等方面是否正常。

4. 其他会导致锁等待的操作:除了你的代码中的插入语句,其他应用程序或者线程是否在执行与该表相关的操作?如果是的话,可能会导致锁等待的现象。可以通过查询数据库的`SHOW PROCESSLIST;`命令来查看当前正在执行的数据库操作。

希望以上建议对你有所帮助。如果问题仍然存在,请提供更多的上下文信息,以便我们能够更深入地帮助你解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-26 17:37:41 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 12:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表