欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » 关系数据库基础教程 » 正文

数据库的并发控制

创建时间:2012年06月12日 16:41  阅读次数:(6001)
分享到:
这里的“并发”是指在单处理机上,利用分时方法实行多个事物同时做。
数据库的并发操作通常会带来四个问题:丢失更新问题、读脏数据问题、错误求和问题和不可重复读问题

/*
该处因编辑困难,省略掉部分示例,如需查看详细示例,请下载电子档教程:
数据库系统的实现技术教程下载
*/

解决方法
以上问题都需要并发控制子系统来解决。对于丢失更新问题可以采取下列三种措施之一加以解决:
①在时间t2应避免事务T2执行FIND操作。因为此时事务T1已读了A值,将要进行更新。
②在时间t5应避免事务T1执行UPD操作。因为事务T2已在使用A值。
③在时间t6应避免事务T2执行UPD操作。因为事务T1已写了新的A值,事务T2的写操作将把T1的写操作冲掉

实现“避免”的方法有两种:
封锁技术( ① 或② )(较实用)
时标( ② 或 ③ )

X锁和S锁


X锁定义
操作
XFIND R
XRELEASE R

PX协议:
任何企图更新记录R的事务必须先执行“XFIND  R”操作,以获得对R的X锁,才能读或写记录R;如果未获准X锁,那么这个事务进入等待队列,一直到获准X锁,事务才能继续做下去。

PXC协议
X锁的解除操作应该合并到事务的结束(COMMIT或ROLLBACK)操作中

S锁定义
操作
SFIND R
UPDX R
SRELEASE R

PS协议
任何要更新记录R的事务必须先执行“SFIND  R”操作,以获得对R的S锁。当事务获准对R的S锁后,若要更新记录R必须用“UPDX  R”操作,这个操作首先把S锁升级为X锁,若成功则更新记录,否则这个事务进入等待队列

PSC协议
S锁的解除操作应该合并到事务的结束

封锁带来的问题1---(活锁)


封锁带来的问题2---饿死


封锁带来的问题3---死锁


并发操作的调度
事务的调度 :事务的执行次序称为“调度” 
串行调度:如果多个事务依次执行,则称为事务的串行调度(Serial Schedule) 
并发调度:如果利用分时的方法,同时处理多个事务,则称为事务的并发调度(Concurrent Schedule)
可串行化 :如果一个并发调度的执行结果与某一串行调度的执行结果等价,那么这个并发调度称为“可串行化的调度”,否则是不可串行化的调度  

两段封锁协议
在对任何一个数据进行读写操作之前,事务必须获得对该数据的封锁; 
在释放一个封锁之后,事务不再获得任何其他封锁 
遵守该协议的事务分为两个阶段:获得封锁阶段,也称为“扩展”阶段;释放封锁阶段,也称为“收缩”阶段 
如果所有的事务都遵守“两段封锁协议”,则所有可能的并发调度都是可串行化的 

SQL中事务的存取模式
1,READ ONLY(只读型):事务对数据库的操作只能是读操作。定义这个模式后,表示随后的事务均是只读型。
2,READ WRITE(读写型):事务对数据库的操作可以是读操作,也可以是写操作。定义这个模式后,表示随后的事务均是读写型。在程序开始时默认这种模式

这两种模式可用下列SQL语句定义:
SET  TRANSACTION  READ  ONLY
SET  TRANSACTION  READ  WRITE

SQL中事务的隔离级别
1,SERIALIZABLE(可串行化):允许事务并发执行,但须保证并发调度可串行化,是默认级别。
2,REPEATABLE READ(可重复读):只许事务读已提交的数据,且两次读之间不许其他事务修改此数据。事务可以不可串行化。
3,READ  COMMITTED(读提交数据):允许事务读已提交的数据,但不要求“可重复读”。
4,READ  UNCOMMITTED(可以读未提交数据):允许事务读已提交或未提交的数据。

上述四种级别可以用下列SQL语句定义: 
SET  TRANSACTION  ISOLATION  LEVEL  SERIALIZABLE
SET  TRANSACTION  ISOLATION  LEVEL  REPEATABLE  READ
SET  TRANSACTION  ISOLATION  LEVEL  READ  COMMITTED
SET  TRANSACTION  ISOLATION  LEVEL  READ  UNCOMMITTED
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 10+47=? 的结果(结果是:57)
结  果: