当前位置:Gxlcms > mysql > Java程序对MySQL数据库加锁实验

Java程序对MySQL数据库加锁实验

时间:2021-07-01 10:21:17 帮助过:80人阅读

Java程序对MySQL数据库加锁实验,以下实验仅在MYSQL 5.0.45做的实验.

以下实验仅在MYSQL 5.0.45做的实验.

方法1:用mysql命令锁住表.

  • pstmt.executeQuery();
  • pstmt1.executeQuery();
  • pstmt2.executeQuery();
  • }
  • }
  • 一、对于read lock 和 write lock官方说明:
    1.如果一个线程获得一个表的READ锁定,,该线程(和所有其它线程)只能从该表中读取。
    如果一个线程获得一个表的WRITE锁定,只有保持锁定的线程可以对表进行写入。
    其它的线程被阻止,直到锁定被释放时为止。

    2.当您使用LOCK TABLES时,您必须锁定您打算在查询中使用的所有的表。
    虽然使用LOCKTABLES语句获得的锁定仍然有效,但是您不能访问没有被此语句锁定的任何的表。
    同时,您不能在一次查询中多次使用一个已锁定的表——使用别名代替,
    在此情况下,您必须分别获得对每个别名的锁定。

    二、对与read lock 和 write lock个人说明:
    1.read lock 和 write lock 是线程级(表级别).
    2.在同一个会话中加了read lock锁. 只能对这个表进行读操作.对这个表以外的任何表都无法进行增、删、改、查的操作.
    但是在不同会话中,只能对加了read lock的表进行读操作.但可以对read lock以外的表进行增、删、改、查的操作.
    3.在同一个会话中加了write lock锁.只能对这个表进行读、写操作.对这个表以外的任何表都无法进行增、删、改、查的操作.
    但是在不同会话中,无法对加了write lock的表进行读、写操作.但可以对write lock以外的表进行增、删、改、查的操作.
    4.如果表中使用了别名.(SELECT * FROM aa1 AS byname_table)
    在对aa1加锁时,必须把别名加上去(lock tables aa1 as byname_table read)
    在同一个会话中.必须使用别名进行查询.
    在不同的会话中.可以不需要使用别名进行查询.
    5.在多个会话中可以对同一个表进行lock read操作.但不能在多个会话中对同一个表进行lock write操作(这些锁将等待已锁的表释放自身的线程锁)
    如果多个会话对同一个表进行lock read操作.那么在这些会话中,也只能对以锁的表进行读操作.
    6.如果要你锁住了一个表,需要嵌套查询.你必须使用别名,并且,要锁定别名.
    例如.lock table aa1 read ,aa1 as byname_table read;
    select * from aa1 where id in (select * from aa1 as xx where id=2);
    7.解锁必须用unlock tables;

    另:
    在JAVA程序中,要想解锁,需要调用 unlock tables来解锁.
    如果没有调用unlock tables.
    关闭connection 、程序结束 、调用GC 都能解锁.

    linux

    人气教程排行