用vs2005做网站设计,移动端h5网站开发框架,企业怎么做好网站优化,seo推广公司网站模板1. 事务隔离的概念
在数据库管理系统中#xff0c;事务隔离是一项重要的功能#xff0c;它能确保在并发访问数据库时事务之间能够独立运行#xff0c;不会相互干扰。数据库系统通常支持不同级别的事务隔离#xff0c;用来满足不同应用程序之间的需求。
2. 事务隔离的种类…
1. 事务隔离的概念
在数据库管理系统中事务隔离是一项重要的功能它能确保在并发访问数据库时事务之间能够独立运行不会相互干扰。数据库系统通常支持不同级别的事务隔离用来满足不同应用程序之间的需求。
2. 事务隔离的种类
常见的事务隔离的种类也一共有四种包括读未提交、读已提交、可重复读和可序列化。而对于并发的事务常见的一些可能发生的行为包括
脏读一个事务读取了另一个未提交的事务写入的数据不可重复读一个事务重新读取了前面读取过的数据但是该数据已经发生了改变幻读一个事务开始之后需要根据数据库中现有的数据做一些更新于是重新执行一个查询返回符合查询条件的行这个时候发现因为其他最近提交的事务自身发生改变导致现有事务如果继续执行可能会发生错误。
下表代表的是不同的事务隔离级别对应的可能会发生的行为的对照关系。 隔离级别 脏读 不可重复读 幻读 读未提交 可能 可能 可能 读已提交 不可能 可能 可能 重复读 不可能 不可能 可能 可串行化 不可能 不可能 不可能
注在PG中默认的事务隔离级别是读已提交而读未提交相当于是读已提交的一个更弱的版本。
这是因为读已提交的隔离级别要求一个事务只能看到已经提交的数据修改这意味着一个事务不能读取另一个事务尚未提交的数据变换。那么这种隔离级别提供了一定的数据一致性防止脏读。这也是为什么PG中采用这种隔离级别为默认的隔离级别因为他的适应性比较广。
而相比于读已提交读未提交的隔离级别不要求事务等待其他事务的提交它允许一个事务读取另一个事务尚未提交的数据变化这种隔离级别容易导致脏读因为一个事务可能会读取到另一个正在被修改的事务而这些事务可能会回滚从而导致数据状态前后不一致。 并且PG中内部没有实现读未提交的隔离级别因为读未提交的隔离级别存在严重的数据一致性问题不符合事务的ACID特性所以并未实现读未提交主要还是为了确保数据库的一致性和可靠性。 2.1 读已提交
PG的默认事务隔离级别事务只能看到已经提交的数据可能会发生不可重复读和幻读
案例
首先创建一个示例表其中包含如下的信息
create table products(id serial primary key,name varchar(50),price numeric(10,2));
select * from products; 会话1读操作
begin;
select * from products where id1; 会话2写操作
begin;
update products set price 66 where id 1; 此时回到会话1:查询id1发现数据还是原来的数据 会话2
commit
当会话2提交以后回到会话1就会发现数据进行了更改 这个案例说明了在读已提交隔离级别中一个事务只能看到其他事务已经提交的数据修改如果事务未提交那么对于查询事务来说这些修改是不可见的直到其他事务提交为止
2.2 可重复读
保证在同一事务内的查询不会受到其他事务的影响防止不可重复读但是仍然可能发生幻读适用场景需要一定程度的数据一致性可以容忍轻微的幻读。
案例
沿用上面的products表的数据将修改的数据修改回原样。 会话1
begin isolation level repeatable read ;
select * from products where id 1; 会话2:
此时会话2.执行更新语句但不提交在会话1中查看数据。 会话2
对事务进行提交再在事务1中查询对应的数据 可以发现在会话1中无论会话2提不提交查询的结果都保持不变即使会话2提交更新操作查询结果仍然不变。
此时除非对会话1也进行提交才可以看到改动就相当于在事务的一开始对数据进行了快照无论如何改动都不影响读取的结果。
2.3 串行化
最高级别的隔离确保事务之间没有任何的交错或者是并发问题通过锁定数据来实现防止任何形式的并发问题包括脏读、不可重复读、幻读性能最差因为他几乎完全禁止并发适用场景对数据一致性要求非常高可以容忍较低的性能.事务2会进行回滚提交失败以后事务的回滚其实就相当于没有执行
案例
会话1
开始串行化隔离插入一条新的数据查询现在的价格 会话2
执行与会话1同样的操作其中开启事务的语句是同时执行的然后再分别插入数据。 可以看到两个会话中新插入的语句只有在自己的事务中才可以查看到 此时将会话1事务进行提交然后将会话2事务进行提交可以看到会话1提交成功而会话2会提交失败且会话2中的事务发生了回滚舍弃了之前的插入操作 重新查询两个会话中表的信息发现都只能查询到会话1提交的事务。