锁概念

suwulin 2003-06-28 12:03:07
共享锁和update锁的概念是怎样定义的?
...全文
37 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
yabbi21 2003-06-28
  • 打赏
  • 举报
回复
共享锁用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的
资源。默认情况下,数据被读取后,立即释放共享锁。例如,执行查询“SELECT *
FROM my_table”时,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第
二页。这样,就允许在读操作过程中,修改未被锁定的第一页。但是,事务隔离级别连
接选项设置和SELECT语句中的锁定设置都可以改变这种设置。例如SQL Server中,
SELECT * FROM my_table HOLDLOCK”就要求在整个查询过程中,保持对表的锁定,直
到查询完成才释放锁定。

修改锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享
锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享
锁,读取数据,然后将共享锁升级为独占锁,然后再执行修改操作。这样如果同时有两
个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享
锁升级为独占锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造
成了死锁。如果一个数据在修改前直接申请修改锁,在数据修改的时候再升级为独占
锁,就可以避免死锁。修改锁与共享锁是兼容的,也就是说一个资源用共享锁锁定后,
允许再用修改锁锁定。
testjava 2003-06-28
  • 打赏
  • 举报
回复
这个概念应该是在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();

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧