《Postgres事物处理与并发控制.ppt》由会员分享,可在线阅读,更多相关《Postgres事物处理与并发控制.ppt(13页珍藏版)》请在三一办公上搜索。
1、Postgres事物处理与并发控制,Postgres事物处理与并发控制,事物与锁1.基本概念(略)2.目的:事务是用来保证数据的一致(integrity)。锁是保证数据的并发(控制多个事务的并发)(concurrency)。3.事务与锁的关系:锁的级别太高,可能会影响数据库的并发。锁的级别越低一般来说数据库的并发越好。,Postgres事物处理与并发控制,事务隔离等级 在数据库操作中,为了有效保证并发操作的正确性,提出了事务隔离等级的概念。事务隔离等级就是为了同时解决一致性和并发的问题而存在的,SQL标准中定义了四种隔离等级,分别是串行化(SERIALIZABLE)、可重复读(REPEATAB
2、LE READ)、读已提交(READ COMMITED)和读未提交(READ UNCOMMITED)四个等级。四个等级并发性能依次升高,隔离度依次降低。,Postgres事物处理与并发控制,Postgres默认事务隔离等级是read-committed,可以通过SET TRANSACTION语句来设置当前事务的隔离级别,注意,该语句仅对当前事务有影响。如果要修改一个回话(session)的事务隔离级别,可以通过 SET SESSION CHARACTERISTICS语句来修改回话中所有事务的隔离级别。SET TRANSACTION可以覆盖SET SESSION CHARACTERISTICS语
3、句,只作用于当前transaction.,Postgres事物处理与并发控制,并发操作带来的数据库不一致性可以分为四类:丢失或覆盖更新、脏读、不可重复读和幻像读。读污染(dirtyreads)一个事务读取了被另一个未提交的并行的事务写的数据。不可重复的读(non-repeatablereads)一个事务重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务修改过。错误读取(phantomread)一个事务重新执行一个查询,返回一套符合查询条件的行,发现这些行中插入了被其他已提交的事务提交的行。这四种隔离级别和对应的特性在下面描述。,Postgres事物处理与并发控制,(1)丢失或覆盖更新
4、 当两个或多个事务选择同一数据,并且基于最初选定的值更新该数据时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。上面预定飞机票的例子就属于这种并发问题。事务1与事务2先后读入同一数据A=16,事务1执行A-1,并将结果A=15写回,事务2执行A-1,并将结果A=15写回。事务2提交的结果覆盖了事务1对数据库的修改,从而使事务1对数据库的修改丢失了。,Postgres事物处理与并发控制,丢失或覆盖更新例子,Postgres事物处理与并发控制,(2)脏读 一个事务读取了另一个未提交的并行事务写的数据。当第二个事务选择其它事务正在更新的行
5、时,会发生未确认的相关性问题。第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。换句话说,当事务1修改某一数据,并将其写回磁盘,事务2读取同一数据后,事务1由于某种原因被撤销,这时事务1已修改过的数据恢复原值,事务2读到的数据就与数据库中的数据不一致,是不正确的数据,称为脏读。,Postgres事物处理与并发控制,脏读例子,Postgres事物处理与并发控制,(3)不可重复读 一个事务重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务修改过。即事务1读取某一数据后,事务2对其做了修改,当事务1再次读数据时,得到的与第一次不同的值。,Postgres事物处理与并发控制,
6、不可重复读例子,Postgres事物处理与并发控制,(4)幻像读 如果一个事务在提交查询结果之前,另一个事务可以更改该结果,就会发生这种情况。这句话也可以这样解释,事务1按一定条件从数据库中读取某些数据记录后未提交查询结果,事务2删除了其中部分记录,事务1再次按相同条件读取数据时,发现某些记录神秘地消失了;或者事务1按一定条件从数据库中读取某些数据记录后未提交查询结果,事务2插入了一些记录,当事务1再次按相同条件读取数据时,发现多了一些记录。,Postgres事物处理与并发控制,产生上述四类数据不一致性的主要原因是并发操作破坏了事务的隔离性。并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性。,