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


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

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

  1.   public void test() {  
  2.   
  3.     String sql = "lock tables aa1 write";  
  4.     // 或String sql = "lock tables aa1 read";   
  5.     // 如果想锁多个表 lock tables aa1 read ,aa2 write , .....   
  6.     String sql1 = "select * from aa1 ";  
  7.   
  8.     String sql2 = "unlock tables";  
  9.     try {  
  10.         this.pstmt = conn.prepareStatement(sql);  
  11.         this.pstmt1 = conn.prepareStatement(sql1);  
  12.         this.pstmt2 = conn.prepareStatement(sql2);  
  13.         pstmt.executeQuery();  
  14.         pstmt1.executeQuery();  
  15.         pstmt2.executeQuery();  
  16.   
  17.     } catch (Exception e) {  
  18.         System.out.println("异常" + e.getMessage());  
  19.     }  
  20.   
  21. }  

一、对于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 都能解锁.      

  • 1
  • 2
  • 下一页

相关内容