一日一记

Posted chenruibin0614

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一日一记相关的知识,希望对你有一定的参考价值。

数据库保护又叫做数据库控制,是通过四个方面实现的,即安全性控制,完整性控制,并发性控制和数据恢复。

 

 

任何支持事务的数据库,都必须具备四个特性,分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),也就是我们常说的事务ACID,这样才能保证事务((Transaction)中数据的正确性。

原子性:一个事物内所有操作共同组成一个原子包,要么全部成功,要么全部失败。

数据库事物的一致性就规定了事物提交前后,永远只可能存在事物提交前的状态和事物提交后的状态,从一个一致性的状态到另一个一致性状态,而不可能出现中间的过程态。

隔离性:事物可以有多个原子包的形式并发执行,但是,每个事物互不干扰。

一致性:当一个事物提交之后,数据库状态永远的发生了改变,这个事物只要提交了,哪怕提交后宕机,他也确确实实的提交了,不会出现因为刚刚宕机了而让提交不生效。

 

一般的数据库,都包括以下四种隔离级别:

读未提交(Read Uncommitted)读提交(Read Committed)可重复读(Repeated Read)串行化(Serializab)

 

技术图片

 

 

 脏读,事务(T1)中修改的数据项在尚未提交的情况下被其他事务(T2)读取到,而T1进行Rollback操作,则T2刚刚读取到的数据并没有实际存在。
不可重复读,T1读取数据项,T2对其中的数据进行了修改或删除且Commit成功。如果T1尝试再次读取这些数据,会得到T2修改后的数据或者发现数据已删除。这样T1在一个事务中两次同样条件的读取,且结果集内容变更或结果集数量减少。
幻读,T1使用特定的查询条件获得一个结果集,T2插入新的数据且这些数据符合T2刚刚操作的查询条件。T2 commit 成功后,T1再次执行同样的查询,此时得到的结果集增大。

 

SQL标准规定的隔离性级别
可串行化(serializable):通常保证可串行化调度。然而,一些数据库系统对该隔离性级别的实现在某些情况下允许非可串行化执行。最高隔离性级别。强制事务串行执行。可避免脏读、不可重复读、幻读的发生。
可重复读(repeatable read):只允许读取已提交数据,而且在一个事务两次读取一个数据项期间,其他事务不得更新该数据。但该事务不要求与其他事务可串行化。例如:当一个事务在查找满足某些条件的数据时,它可能找到一个已提交事务插入的一些数据,但可能找不到该事务插入的其他数据。保证在同一个事务中多次读取同样数据的结果是一样的。可避免脏读、不可重复读的发生。
已提交读(read committed):只允许读取已提交数据,但不要求可重复读。比如,在事务两次读取一个数据项期间,另一个事务更新了该数据并提交。一个事务只能读取已经提交的事务所做的修改。换句话说,一个事物所做的修改在提交之前对其他事务是不可见的。可避免脏读的发生。
未提交读(read uncommitted):允许读取未提交数据。这是SQL允许的最低一致性级别。事务中的修改,即使没有提交,对其他事务也是可见的。最低级别,任何情况都无法保证。
以上所有隔离性级别都不允许dirty write),即如果一个数据项已经被另外一个尚未提交或中止的事务写入,则不允许对该数据项执行写操作。
许多数据库系统运行时的默认隔离性级别是已提交读。在SQL中,除了接受系统的默认设置,还可以显式地设置隔离性级别。例如,语句“set transaction isolation level serializable;”将隔离性级别设置为可串行化,其他隔离性级别可类似设定。
修改隔离性级别必须作为事务的第一条语句执行。此外,如果单条语句的自动提交默认打开,则必须关闭。

 

以上是关于一日一记的主要内容,如果未能解决你的问题,请参考以下文章

随笔就是随笔一记

每日一记--技术小细节

2018-12-12每日一记

随手一记

python 日常一记 基础

每日一记8.7