PostgreSQL数据库平常学习笔记17-事务和锁

PostgreSQL中提供多种机制保证数据完整性。例如约束、触发器、事务和锁管理等。html

PostgreSQL一个特色是并发控制机制,在维护一致性和完整性时,尽可能避免堵塞读写。sql

在PostgreSQL中,使用多版本并发控制(MVCC)维护数据一致性,相对于锁定模型,多版本控制系统主要优势是读(检索)数据和写数据锁请求不互相冲突,读写不互相阻塞。传统数据库,为维护数据一致性和完整性,避免一个事务读写到其它并发事务更新所产生不一致数据,一般采用就会使用LOCK机制。付出成本就是,当锁请求没法被响应时,待处理请求必须进入等候队列,甚至等待超时不被处理。数据库

在平常数据库操做中,通常状况下咱们对于一组操做一般但愿可以所有成功或失败,即不容许部分红功状况发生。一组操做,要么所有执行完毕,要么彻底执行失败,相似操做被称为事务。并发

数据库管理系统(DBMS)中,事务(transaction)具备四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),合并缩写为ACID。.post

原子性是指事务是一个不可再分割工做单元,事务中所有操做要么所有执行,要么都不执行,若是中途出现错误,须要回滚已完成全部操做,让数据恢复到未执行操做前状态。设计

一致性是指在事务开始以前和事务结束之后,数据库的完整性约束没有被破坏。版本控制

对于并发事务,咱们不但愿发生不一致状况,根据产生不一致结果严重状况,分为脏读、不可重复读 、幻读和序列化异常。postgresql

脏读是一个事务读取另外一个事务未完整提交时数据,该事务执行存在失败可能性,数据有可能回滚到初始状态,致使读取错误数据,所以最不但愿发生。htm

针对同一个数据,前一个事务内屡次查询,因为期间后一个事务同时在提交数据,前一个事务重复读取后一个事务数据致使执行结果不一样,即前一个事务执行结果不一致,出现不可重复读,少数状况下,可能会出现问题。队列

幻读是指执行两个彻底相同查询,第二次查询所返回结果集与第一次查询不相同,幻读可能致使事务出现逻辑错误。

序列化异常是指成功提交一组事务执行结果与这些事务可串行执行结果不一致。

SQL标准定义四个级别事务隔离,分别是读未提交(read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和可串行化(serializable)。可串行化经过数据库标准定义,保证并发和顺序执行结果相同;其余三个级别是经过现象定义的。

不一样事物隔离级别行为各不相同,读未提交可能出现脏读;读未提交和读已提交可能致使不可重复读,读未提交、读已提交和重复读可能致使幻读。

PostgreSQL可使用命令设置任意一种事务隔离级别,实际上只有读已提交和可串行化两种。读已提交是PostgreSQL中的默认隔离级别。

PostgreSQL支持两段提交协议。两段提交是2台以上数据库实现原子性关键技术。

PostgreSQL存在表级锁和行级锁。当执行查询、插入、更新、删除等操做时,首先须要获取表级锁,再获取行级锁。

死锁是指两个不一样事务相互影响,致使两个事务均没法正常执行。例如2个事务操做2个不一样表时存在两个排斥锁互相请求对方表排斥锁,两个事务均没法正常执行。

当事务设计不严谨时,可能会致使锁等待很严重,甚至出现死锁,严重影响数据库正常运行。

参考连接

http://www.jianshu.com/p/04b542aeebac

https://www.postgresql.org/docs/10/static/transaction-iso.html

参考书籍

PostgreSQL 修炼之道 从小工到专家 P203-P220

相关文章
相关标签/搜索