共享锁用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的
资源。默认情况下,数据被读取后,立即释放共享锁。例如,执行查询“SELECT *
FROM my_table”时,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第
二页。这样,就允许在读操作过程中,修改未被锁定的第一页。但是,事务隔离级别连
接选项设置和SELECT语句中的锁定设置都可以改变这种设置。例如SQL Server中,
SELECT * FROM my_table HOLDLOCK”就要求在整个查询过程中,保持对表的锁定,直
到查询完成才释放锁定。修改锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享
锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享
锁,读取数据,然后将共享锁升级为独占锁,然后再执行修改操作。这样如果同时有两
个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享
锁升级为独占锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造
成了死锁。如果一个数据在修改前直接申请修改锁,在数据修改的时候再升级为独占
锁,就可以避免死锁。修改锁与共享锁是兼容的,也就是说一个资源用共享锁锁定后,
允许再用修改锁锁定。
资源。默认情况下,数据被读取后,立即释放共享锁。例如,执行查询“SELECT *
FROM my_table”时,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第
二页。这样,就允许在读操作过程中,修改未被锁定的第一页。但是,事务隔离级别连
接选项设置和SELECT语句中的锁定设置都可以改变这种设置。例如SQL Server中,
SELECT * FROM my_table HOLDLOCK”就要求在整个查询过程中,保持对表的锁定,直
到查询完成才释放锁定。修改锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享
锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享
锁,读取数据,然后将共享锁升级为独占锁,然后再执行修改操作。这样如果同时有两
个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享
锁升级为独占锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造
成了死锁。如果一个数据在修改前直接申请修改锁,在数据修改的时候再升级为独占
锁,就可以避免死锁。修改锁与共享锁是兼容的,也就是说一个资源用共享锁锁定后,
允许再用修改锁锁定。
解决方案 »
- 配置好JDK后.class文件不能生成在.java文件的目录下是怎么回事??
- javaMail中文API文档(谁有,给一个中文的)
- 所有分都给你,怎样作迅雷软件那样批量下载?
- 请教url转向的问题
- 高手请留步:一个目前论坛中还没有找到确定答案的常见问题!!!关于可滚动结果集!
- 下载文件时遇到的关于getOutputStream()问题
- 请问怎样通过JSP调用客户机上的可执行文件?
- 用ajax访问springmvc中方法,为啥返回值出错
- 在<%!...%>中,怎么样读取<%...%>中声明的变量!
- 今天碰到一个奇怪的问题,关于个别字乱码
- 怎么样可以屏蔽掉浏览器的刷新?
- 在JAVASCRIPT当中怎么用代码展开一棵树
============
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();