postgresql实战—事务和事务隔离级别

2022-08-05  本文已影响0人  熊猫学猿

当sql的where条件中出现or时很有可能出现Bitmap index扫描。

事务是数据库系统执行过程中最小的逻辑单位,当事务被提交时,数据库管理系统要确保一个事务中所有的操作都成功完成,并且在数据库中永久保存操作结果。如果一个事务中的一部分没有操作完成,则数据库管理系统会把数据库回滚到操作执行前的状态。

事务有四个重要的特性:

原子性:一个事务的所有操作,要么全部执行,要么全部不执行。

一致性:执行事务时保持数据库从一致的状态变更到另一个一致的状态。

隔离性:即使每个事务都能确保一致性和原子性,如果并发执行时,由于它们的操作以人们不希望的方式交叉运行,就会导致不一致的情况发生。确保事务与事务并发只需时,每个事务都感觉不到其他事务在并发地执行。

持久性:一个事务完成后,即使数据库发生故障,它对数据库的改变应该永久保存在数据库中。

事务一致性由主键、外键这类约束保证,持久性由预写日志(WAL)和数据库管理系统的恢复子系统保证,原子性、隔离性则由事务管理器和MVCC来控制。

脏读:当第一个事务读取了第二个事务中已经修改但还未提交的数据,包括INSERT、UPDATE、DELETE,当第二个事务不提交并执行ROLLBACK后,第一个事务所读取到的数据是不正确的。

不可重复读:党第一个事务第一次读取数据之后,被读取的数据被另一个已提交的事务进行了修改,事务再次读取这些数据时发现数据已经被另一个十五修改,两次查询的结果不一致。

幻读:指一个事务的两次查询的结果集记录数不一致。例如一个事务第一次根据范围条件查询了一些数据,而另一个事务却在此时插入或删除了这个事务查询结果集中的部分数据,这个事务会在接下来会查询中,会发现有一些数据在它先前的查询结果中不存在,或者第一次查询结果中的一些数据不存在了,两次查询结果不同。

ANSI SQL标准的事务隔离级别:

Read Uncommitted(读未提交):所有事务都可以看到其他未提交事务的执行结果,这一事务隔离级别很少用于实际应用。

Read Committed(读已提交):默认隔离级别,一个事务只能看见已提交事务对关联数据所做的改变的隔离需求。

Repeatable Read(可重复读):确保同一事务的多个实例在并发读取数据时,会看到同样的数据行

Serializable(可序列化):最高的隔离级别,它通过强制事务排序,使在不可能相互冲突,从而解决幻读问题。

上一篇下一篇

猜你喜欢

热点阅读