java.sql.SQLException:无法锁定表“更改”;用户当前正在使用

Posted

技术标签:

【中文标题】java.sql.SQLException:无法锁定表“更改”;用户当前正在使用【英文标题】:java.sql.SQLException: Could not lock table 'change'; currently in use by user 【发布时间】:2012-01-04 04:45:03 【问题描述】:

这是我的问题,我在 jdbc 概念上编写了一个程序,一切都很好,它编译并运行没有错误。问题出在哪里,因为我需要通过删除来更改行的值 上一行(因为表格只有一行),如果需要使用程序添加列,这两个操作只有在任何一个完成时才能成功。

但是由于这两个操作是在同一帧上完成的。当我更改行时,成功后 更新行,我无法插入新列。当我尝试插入该列时,它显示为错误

java.sql.SQlException:[Micros​oft][ODBC Micro Access Driver] Could not
 lock table 'change' ; currently in use by user 'admin' on 'machine
 chiru-pc

这里的“更改”是完成这些更改的表。

谁能告诉我我该如何纠正这个错误?




这是我使用的代码

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.event.*;
    import java.sql.*;
    import java.io.*;
    import java.util.*;

    class Change extends JFrame implements ActionListener
    
JButton done,ok,add;
JLabel[] c = new JLabel[50]; 
JLabel[] o = new JLabel[50]; 
JLabel lsx,lad,ln,lo,lc,la;
JTextField[] tf = new JTextField[50];
JTextField t;
int i=0,noc=0,d,h=0;
int[] e=new int[50];
String s;
Connection con; 

 public Change()
        
        tryClass.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        catch(ClassNotFoundException ce)System.out.println(ce);
        trycon=DriverManager.getConnection("jdbc:odbc:TAILORING");
        Statement st=con.createStatement();
        Dimension screensize =Toolkit.getDefaultToolkit().getScreenSize();
        setBounds(0,0,screensize.width,screensize.height);
            setTitle("STITCHING COST DETAILS"); 
                setLayout(null);  
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        ResultSet rs=st.executeQuery("select * from change");
        ResultSetMetaData r=rs.getMetaData();
        noc=r.getColumnCount();
        done=new JButton("DONE");
        ok=new JButton("OK");
        add=new JButton("ADD");
        t=new JTextField(50);
        for(i=1;i<=noc;i++)c[i] =new JLabel();
        for(i=1;i<=noc;i++)o[i] =new JLabel();
        for(i=1;i<=noc;i++)tf[i] =new JTextField(30);
        for(i=1;i<=noc;i++)c[i].setText(r.getColumnName(i));c[i].setFont(new Font("Narkisim",Font.ITALIC,20));
        ResultSet ra=st.executeQuery("select * from change");
        while(ra.next())
            
                if(d==0)for(i=1;i<=noc;i++)o[i].setText(String.valueOf(ra.getInt(i)));o[i].setFont(new Font("Narkisim",Font.ITALIC,20));
                d++;
            
        lad= new JLabel("SRIHARIPURAM,VISAKHAPATNAM-11  ////  MASTER: CH. SRI RAMAKRISHNA");
        lad.setFont(new Font("Narkisim",Font.ITALIC,15));
        lsx=new JLabel("SUNNEX TAILORS");
        lsx.setFont(new Font("Algerian",Font.ITALIC,80));
        lc= new JLabel("COSTUME LIST");
        lc.setFont(new Font("Narkisim",Font.ITALIC,15));
        lo= new JLabel("OLD RATES");
        lo.setFont(new Font("Narkisim",Font.ITALIC,15));
        ln= new JLabel("NEW RATES");
        ln.setFont(new Font("Narkisim",Font.ITALIC,15));
        la= new JLabel("ADD NEW COSTUME");
        la.setFont(new Font("Narkisim",Font.ITALIC,15));
        add(lsx,(screensize.width/3)-(screensize.width/25),(screensize.height/25),710,100);
        add(lad,(screensize.width/3),(screensize.height/8),610,40);
        add(lc,(screensize.width/5),180,100,20);
        add(lo,(screensize.width/3),180,610,20);
        add(ln,(screensize.width/2),180,610,20);
        add(done,(screensize.width/2)+(screensize.width/6),(screensize.height/3),100,20);
        add(ok,(screensize.width/2),(screensize.height)-(screensize.height/7),100,20);
        add(add,(screensize.width/4),(screensize.height)-(screensize.height/7),100,20);
        add(t,(screensize.width/4),(screensize.height)-(screensize.height/5),100,20);
        add(la,(screensize.width/4),(screensize.height)-(screensize.height/4),200,20);
        for(i=1;i<=noc;i++)
            
                add(c[i],(screensize.width/5),(200+(30*i)),100,20);
            
        for(i=1;i<=noc;i++)
            
                add(o[i],(screensize.width/3),(200+(30*i)),100,20);
            
        for(i=1;i<=noc;i++)
            
                add(tf[i],(screensize.width/2),(200+(30*i)),100,20);
            
            add.addActionListener(this);
            ok.addActionListener(this);
            done.addActionListener(this);
        catch(SQLException ce)System.out.println(ce);
    
public void add(JComponent c,int x,int y,int w,int h)
    
        c.setBounds(x,y,w,h);
            add(c);
    
public void actionPerformed(ActionEvent ae)
    
        if(ae.getSource() ==ok)
               
                setVisible(false);  
                Tailoring t=new Tailoring();
            
        if(ae.getSource() ==add)
            
                setVisible(false);
                Add a=new Add();

            
        if(ae.getSource() ==done)
               

                tryClass.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                catch(ClassNotFoundException ce)System.out.println(ce);
                trycon=DriverManager.getConnection("jdbc:odbc:TAILORING");
                Statement st=con.createStatement();d=0;
            ResultSet ra=st.executeQuery("select * from change");
            while(ra.next())
            
                if(d==0)
                for(i=1;i<=noc;i++)
                    
                    if(h==0)s=(Integer.parseInt(tf[i].getText())+",");
                    else if(h==(noc-1))s+=(Integer.parseInt(tf[i].getText()));
                    else if(h!=0 && h!=noc)s+=(Integer.parseInt(tf[i].getText())+",");
                    h++;
                    d++;
                
            
            st.execute
            (
                "DELETE FROM change"
            );
                st.execute
                (
                    "insert into change values("+s+")"
                );

                catch(SQLException ce)System.out.println(ce);
                try Thread.sleep(500);
                catch(InterruptedException e)
                setVisible(false);
                Change c=new Change();
            
        

这里这个类的变化是一个子类而不是主类

【问题讨论】:

我们需要您正在尝试的精确简洁的代码。 【参考方案1】:

您似乎通过 GUI 使用管理员角色登录到同一个数据库/表。从 GUI 注销并再次运行您的程序。

【讨论】:

当我需要插入更多列时,这似乎是个问题,如果要插入 5 列,我必须关闭 GUI 5 次。 从 ms access 数据库打开同一张表时,您不能对表进行任何修改。 我可以在不关闭 gui 的情况下使用一些编码关闭并重新打开数据库 似乎有人能够通过 VBA 做到这一点,但我认为通过 Java 是不可能的。这是链接dbforums.com/microsoft-access/…【参考方案2】:

您应该在尝试运行 DDL 之前提交您的更改,即向表中添加一个新列。

【讨论】:

hi anubhav ya,正如你所说,它可以工作,但我需要以任何一种方式完成它们 - 在插入列后添加行或在插入行后添加列 您可以在同一个事务中对数据库进行所有写入(INSERT、UPDATE、DELETE),而无需在两者之间进行 COMMIT,但是为了将新列添加到不应锁定该表的某个表中这是由于您之前的写作而发生的。所以我建议你先添加列,然后对你的表执行 WRITE 操作。 k 谢谢你 anubhav,那么没有其他选项可以解锁桌子【参考方案3】:

mysql命令行,尝试执行:

show full processlist;

并查找可能在您的表上锁定的进程。

如果你找到了一个,并且想要杀死它,请注意id 列。您可以执行以下两项操作之一:

终止连接及其所做的任何事情:kill number_in_id_column 终止查询(但保持连接不变):kill query number_in_id_column

【讨论】:

波西米亚人我在我的程序中使用 ms 访问作为数据库,我如何知道它作为访问我的意思是持有锁的人 为什么你用mysql标签来标记这个问题,而这似乎是一个ms access问题?!你必须小心标签!那么,这不是一个mysql问题吗?【参考方案4】:

我创建了一个新类 Add ,我可以在其中一键添加所需数量的列,我这样做成功了,现在它没有显示我发布的错误。

【讨论】:

以上是关于java.sql.SQLException:无法锁定表“更改”;用户当前正在使用的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException:无法从底层数据库获取连接! — HSQLDB

java.Sql.SQLException,无法加载类 net.ucanaccess.jdbc.UcanaccessDriver

无法获得 JDBC 连接;嵌套异常是 java.sql.SQLException:无法加载 JDBC 驱动程序类 'org.hsql.jdbcDriver'

java.sql.SQLException:无法锁定表“更改”;用户当前正在使用

Apache Derby - java.sql.SQLException:无法启动数据库

java.sql.SQLException: 无法从套接字读取更多的数据