共享锁用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的
资源。默认情况下,数据被读取后,立即释放共享锁。例如,执行查询“SELECT *
FROM my_table”时,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第
二页。这样,就允许在读操作过程中,修改未被锁定的第一页。但是,事务隔离级别连
接选项设置和SELECT语句中的锁定设置都可以改变这种设置。例如SQL Server中,
 SELECT * FROM my_table HOLDLOCK”就要求在整个查询过程中,保持对表的锁定,直
到查询完成才释放锁定。修改锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享
锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享
锁,读取数据,然后将共享锁升级为独占锁,然后再执行修改操作。这样如果同时有两
个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享
锁升级为独占锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造
成了死锁。如果一个数据在修改前直接申请修改锁,在数据修改的时候再升级为独占
锁,就可以避免死锁。修改锁与共享锁是兼容的,也就是说一个资源用共享锁锁定后,
允许再用修改锁锁定。

解决方案 »

  1.   

    这个概念应该是在ORACEL中用的比较频繁吧:例如:
    ============
    java.sql.PreparedStatement pstmt = null; 
    ResultSet rs = null; 
    String query = ""; 
     
    conn.setAutoCommit(false); 
           query = "insert into clobtest_table(id,picstr) values(?,empty_clob())"; 
    java.sql.PreparedStatement pstmt = conn.prepareStatement(query); 
    pstmt.setString(1,"001"); 
    pstmt.executeUpdate(); 
    pstmt = null 
           query = "select picstr from clobtest_table where id = '001' for update"; //必须锁定,否则会出错
    pstmt = con.prepareStatement(query) 
    rs= pstmt.executeQuery(); 
     
    oracle.sql.CLOB clobtt = null; 
    if(rs.next()){ 
        clobtt = (oracle.sql.CLOB)rs.getClob(1); 

    Writer wr = clobtt.getCharacterOutputStream(); 
    wr.write(strtmp); 
    wr.flush(); 
    wr.close(); 
    rs.close(); 
    con.commit();