这里的“并发”是指在单处理机上,利用分时方法实行多个事物同时做。
数据库的并发操作通常会带来四个问题:丢失更新问题、读脏数据问题、错误求和问题和不可重复读问题
/*
该处因编辑困难,省略掉部分示例,如需查看详细示例,请下载电子档教程:
数据库系统的实现技术教程下载*/
解决方法以上问题都需要并发控制子系统来解决。对于丢失更新问题可以采取下列三种措施之一加以解决:
①在时间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