JDBC和数据库事务详解(二)
2016-12-12 11:14
232 查看
行锁
假设每个数据行支持两种锁RS和RX;RS表示Row Share,行共享锁,不同的连接可以对同一行记录同时上RS锁,即行共享锁,多个连接被允许同时对一条记录上共享锁;RX表示Row Exclusive,即行排它锁,只能有一个连接可以对一行记录上RX锁。另外,锁可以升级,如果期望给一行数据上RX锁而当前行已经存在一个RS锁,那么RS所会升级成RX锁。但是反过来,锁不能降低级,如果已经存在RX锁,希望上一个RS锁,那么必须等待解锁。已存在行锁 | 期望新加行锁 | 执行方式 |
---|---|---|
null | RS | 成功,加上RS锁 |
null | RX | 成功,加上RX锁 |
RS | RS | 成功,因为RS是共享的,多个连接可同时锁 |
RS | RX | 成功,因为RS锁支持升级为RX锁 |
RX(其它连接加的) | RS | 等待解锁再上锁,因为RX是排它的,可能超时 |
RX(同一连接加的) | RS | 忽略操作直接完成,锁保持RX不变 |
RX(其它连接加的) | RX | 等待解锁再上锁,因为RX是排它的,可能超时 |
RX(同一连接加的) | RX | 忽略操作直接完成,锁保持RX不变 |
表锁
类似地,对一张表级别的锁而言, 也有两种锁TS和TX,工作原理RS, RX非常类似,不再描述修改语句和悲观锁查询语句的行锁和表锁
对于修改语句,典型如下:
INSERT INTO MY_TABLE(C1, C2, …, CN) VALUES(V1, V2, …, VN);UPDATE MY_TABLE SET C1 = V1, C2 = V2, … CN = VN WHERE C1 = OV1;
DELETE FROM MY_TABLE WHERE C1 = V1;
他们所对应的锁行为都是:
1. 首先对MYT_TABLE表上TS锁
2. 再对被插入或修改的所有行上RX锁(删除后无行,行锁操作忽略)。
任何隔离级别下的悲观锁查询
SELECT … FOR UPDATE均如此工作:
1. 首先在对被查询的表上TS锁
2. 再对查询到的所有行上RX锁。
可以发现,悲观锁查询和类似修改语句
普通查询的行锁和表锁
普通查询语句在不同的隔离级别下工作机制不一样(1)如果当前连接的隔离级别为未提交读。不进行任何行锁和表锁的操作,无论表或数据行是否有锁以及是什么锁,均不理会,直接无条件取。
(2)如果当前连接的隔离级别为提交读。对所有被查到的行上RS锁。如果其它连接已经使用修改或悲观锁查询让相同行具备了RX锁,因为RX无法降级为RS,必须等待其它连接解锁才能返回查询结果,从而保证不会读到未提交数据。
(3)如果当前连接的隔离级别为可重复读。先对表上TS锁,然后对对所有被查到的行上RX锁。从而保证其它连接不能对相同的数据行上RX锁进行修改或悲观锁查询
(4)序列化读隔离级别,直接对表上TX锁,直接阻止其它连接对表上TS锁,即其他连接不能对同一张表的任何数据行进行修改或悲观锁查询
在一般的数据库事务中,一个事务就代表着一个链接,事务的隔离级别既是链接的隔离级别,不同的锁行为即代表了不同的执行效率,这点是需要大家透彻理解的。
相关文章推荐
- JDBC和数据库事务详解(一)
- [zt]JDBC对数据库的事务操作
- JDBC对数据库的事务操作
- android数据库事务操作详解
- JDBC事务和数据库事务嵌套的讨论
- JDBC对数据库的事务操作
- JDBC的数据库事务
- SQL Server2008 事务和锁详解(MSSQL个人笔记之数据库优化之路 五)
- JDBC如何与各种数据库连接详解
- JDBC对数据库的事务操作
- Java程序员从笨鸟到菜鸟之(七十八)细谈Spring(七)spring之JDBC访问数据库及配置详解
- [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]数据库 'tempdb' 的日志已满。请备份该数据库的事务日志以释放一些日志空间。
- JDBC事务和数据库事务嵌套的讨论
- JDBC对数据库的事务操作
- java连接数据库JDBC开发详解
- 数据库及ADO.NET------招聘题:事务是什么?JDBC如何控制事务?
- JDBC对数据库的事务操作
- spring 2.5整合jdbc进行数据库操作和注解事务控制
- 数据库的事务JDBC
- Java程序员从笨鸟到菜鸟之(七十八)细谈Spring(七)spring之JDBC访问数据库及配置详解