鱼C论坛

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

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

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

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

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

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

这个是配置文件
package zwl.lesson5;

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

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class jdbcUtils_pool {
    private static DataSource ds =null;

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

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

            ds = BasicDataSourceFactory.createDataSource(properties);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

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

        }
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (coon != null) {
            try {
                coon.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
package zwl.lesson5;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TextPool {
    public static void main(String[] args) {
        Connection conn=null;
        PreparedStatement st=null;
        ResultSet rs=null;
        try {
            conn= jdbcUtils_pool.getConnection();

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

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

            int i=st.executeUpdate();

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

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            jdbcUtils_pool.release(conn,st,rs);
        }
    }
}
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
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
        at com.mysql.jdbc.Util.getInstance(Util.java:408)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:952)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3978)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3914)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2495)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1903)
        at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2124)
        at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2058)
        at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5158)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2043)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
        at zwl.lesson5.TextPool.main(TextPool.java: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-11-21 20:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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