文档库 最新最全的文档下载
当前位置:文档库 › 隔离级别

隔离级别

隔离级别
隔离级别

事务准备接受不一致数据的级别称为隔离级别。

并发操作带来的数据不一致性主要包括丢失修改,不可重复读和读“脏”数据。

在最终的Balance中,事务T2的存款没有体现出来,事务T2的更新丢失了。

1.更新丢失(lost updates problem):无法重复读取特例,有两个并发事务同时读取同

一行数据然后其中一个对它进行修改提交而另一个也进行了修改提交这就会造成第一次写操作失效。

例如:T1读取Balance –》 T2读取Balance –》 T2存款后计算了更新了Balance –》T2提交–》 T1存款后根据T1读取的Balance为基准更新了Balance –》 T1提交在最终的Balance中,事务T2的存款没有体现出来,事务T2的更新丢失了。

2.不可重复读取(Non-repeatable Reads):一个事务对同一行数据重复读取两次但是却

得到了不同结果。例如在两次读取中途有另外一个事务对该行数据进行了修改并提交。

例如:假设List是一个乘客列表,Count是这个列表的乘客数量。

T1读取List-> T2读取List –> T2预订了一个座位–> T2读取了Count –> T2将Count值加1 –> T2提交–> T1读取Count。

事务T1看到的是一个新乘客加入前的List和新乘客加入后的Count,出现了不一致问题。

3.脏读取(Dirty Reads):一个事务开始读取了某行数据但是另外一个事务已经更新了

此数据但没有能够及时提交。这是相当危险的。这样另一个事务读到的数据为”脏”

数据,即为不正确的数据。

假设事务T2中事务T1提交前读取了T1写过的数据项Balance(存款),在事务T1提交前就释放了Balance上的写锁时就可能发生这种问题:由于事务T2读取的Balance是一个没有提交的事务修改后的值,而这个值可能不会最终出现在数据库中。

4.幻读(Phantom Reads):也称为幻像(幻影)。事务在操作过程中进行两次查询,第

二次查询结果包含了第一次查询中未出现的数据(这里并不要求两次查询SQL语句相同)。

这是因为在两次查询过程中有另外一个事务插入一些数据造成的。或者说事务在操作过程中进行两次查询,第二次查询结果不见了第一次查询中出现的数据(这里并不要求两次查询SQL语句相同)。这是因为在两次查询过程中有另外一个事务删除了一些数据造成的。

例如:有两个表,Accounts表,其中每个元组对应银行中的一个账户;Depositors表,其中每个元组对应一个存款人。Depositors表中有一个TotalBalance属性,指的是一个特定存款人所有账户的余额总和。

有两个事务访问这张表。一个对应Mary的审计事务T1,先从Account表中查询出Mary 的所有账户的余额总和。

select sum(balance) from accounts a where https://www.wendangku.net/doc/ae17945411.html, = ‘Mary’

然后,把这个Select语句的返回值与下面的Select语句返回值进行比较:

selectd.TotalBalance from depositors d where https://www.wendangku.net/doc/ae17945411.html, = ‘Mary’

同时还有一个并发执行的事务T2,为Mary创建一个新账户。它为Mary创建了一个初始余额为100的新账户,用如下语句向Accounts表中增加一个元组:

insert into accounts values(‘10021’, ‘Mary’, 100)

然后用如下语句更新Depositors表中恰当的元组,将Mary的TotalBalance值加100 update depositors set TotalBalance = TotalBalance + 100 where name = ‘Mary’假设事务T1在执行第一个Select语句时获取了Accounts表中Mary账户对应的元组上的锁,但是这不能防止事务T2向这个表中插入一个全新的元组。所以,对元组枷锁不能保证生成可串行化的调度。然后,对表枷锁可以方式生成不满足可串行化的调度,因为它完全控制了对表的访问。

这个问题的根源是:事务T1认为它已经锁柱了Name=‘Mary’的所有元组,但事务T2修改了Name=‘Mary’对应的元组集。这个新的元组就称为一个幻像。幻像可能导致生成非可串行化调度,因此也就可能生成错误结果。

以上的数据不一致的主要原因是并发操作破坏了事务的隔离性。

为了避免上面出现几种情况在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同。

1.读未提交(Read Uncommitted):UR允许脏读取但不允许更新丢失,如果一个事务已经开始写数据则另外一个数据则不允许同时进行写操作但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。事务隔离的最低级别,仅可保证不读取物理损坏的数据。与READ COMMITTED 隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据。

2. 读已提交(Read Committed):RC允许不可重复读取但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现,读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将会禁止其他事务访问该行。SQL Server 默认的级别。在此隔离级下,SELECT 命令不会返回尚未提交(Committed)的数据,也不能返回脏数据。

3. 可重复读(Repeatable Read):RR禁止不可重复读取和脏读取。但是有时可能出现幻影数据,这可以通过“共享读锁”和“排他写锁”实现,读取数据事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。在此隔离级下,用SELECT 命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级。

4. 序列化/可串行化(Serializable):提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作事务访问到。事务隔离的最高级别,事务之间完全隔离。如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠事务均是串行的。

隔离级需要使用SET 命令来设定其语法如下:

SET TRANSACTION ISOLATION LEVEL

{READ COMMITTED

| READ UNCOMMITTED

| REPEATABLE READ

| SERIALIZABLE }

下面是四种隔离级别允许不同类型的行为。

隔离级别脏读不可重复读取幻像(幻影)

读未提交是是是

读已提交否是是

可重复读否否是

可串行化否否否

隔离级别越高越能保证数据完整性和一致性,但是对并发性能影响也越大。对于多数应用程序,可以优先考虑把数据库系统隔离级别设为Read Committed ,它能够避免脏读取而且具有较好并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

锁(Lock)是在多用户环境下对资源访问的一种限制。机制当对一个数据源加锁后,此数据源就有了一定的访问限制。我们就称对此数据源进行了“锁定”。在SQL Server中,可以对以下的对象进行锁定:

数据行(Row):数据页中的单行数据;

索引行(Key):索引页中的单行数据,即索引的键值;

页(Page):页是SQL Server 存取数据的基本单位,其大小为8KB;

盘区(Extent):一个盘区由8 个连续的页组成;

表(Table);

数据库(Database)。

在SQL Server 中,锁有两种分类方法。

(1)从数据库系统的角度来看

锁分为以下三种类型:

1.独占锁(Exclusive Lock)

独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受。执行数据更新命令,即INSERT、 UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁。但当对象上有其它锁存在时,无法对其加独占锁。独占锁一直到事务结束才能被释放。

2.共享锁(Shared Lock)

共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。在SELECT 命令执行时,SQL Server 通常会对对象进行共享锁锁定。通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放。

3.更新锁(Update Lock)

更新锁是为了防止死锁而设立的。当SQL Server 准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server 确定要进行更新数据操作时,它会自动将更新锁换为独占锁。但当对象上有其它锁存在时,无法对其作更新锁锁定。

2)从程序员的角度看

锁分为以下两种类型:

1.乐观锁(Optimistic Lock)

乐观锁假定在处理数据时,不需要在应用程序的代码中做任何事情就可以直接在记录上加锁、即完全依靠数据库来管理锁的工作。一般情况下,当执行事务处理时SQL Server会自动对事务处理范围内更新到的表做锁定。

2.悲观锁(Pessimistic Lock)

悲观锁对数据库系统的自动管理不感冒,需要程序员直接管理数据或对象上的加锁处理,并负责获取、共享和放弃正在使用的数据上的任何锁。

锁定优化程序提示及其描述

优化程序提示优化程序提示描述

holdlock 保持锁定直到事务结束

nolock 检索数据时不使用锁

paglock 使用页面锁

tablock 使用表锁

tablockx 使用独占表锁

updlock 使用更新锁

如: SELECT * FROM authors (paglockholdlock index=aunmind)

死锁及其防止:

死锁(Deadlocking)是在多用户或多进程状况下,为使用同一资源而产生的无法解决

的争用状态,通俗地讲,就是两个用户各占用一个资源,两人都想使用对方的资源,但同时

又不愿放弃自己的资源,就一直等待对方放弃资源,如果不进行外部干涉,就将一直耗下去。

死锁会造成资源的大量浪费,甚至会使系统崩溃。在SQL Server 中解决死锁的原则是“牺牲一个比两个都死强”,即挑出一个进程作为牺牲者,将其事务回滚,并向执行此进程的

程序发送编号为1205 的错误信息。而防止死锁的途径就是不能让满足死锁条件的情况发生,为此,用户需要遵循以下原则:

尽量避免并发地执行涉及到修改数据的语句;

要求每个事务一次就将所有要使用的数据全部加锁,否则就不予执行;

预先规定一个封锁顺序所有的事务,都必须按这个顺序对数据执行封锁,例如,不同的过程在事务内部对对象的更新执行顺序应尽量保持一致;

每个事务的执行时间不可太长,对程序段长的事务可考虑将其分割为几个事务。

隔离级别脏读不可重复读虚拟读取未提交读是是是

已提交读否是是

可重复读否否是

快照否否否

可序列化否否否

MySQL事务隔离级别详解

MySQL事务隔离级别详解 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。 Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。 Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。 Repeatable Read(可重读) 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例 在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon

存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。 Serializable(可串行化) 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。 这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如: 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。 在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:

测验答案-第12章事务管理

测验 填空题 (1) 事务的四个特性分别是、、和。 答案:原子性,一致性,隔离性,持久性 (2) 如果要回滚一个事务,应用使用语句。 答案:ROLLBACK TRANSACTION (3) 设置可序列化隔离级别的命令是SET TRANSACTION ISOLATION LEVEL 。 答案:SERIALIZABLE (4) 如何将当前连接设置为隐式事务模式:。 答案:SET IMPLICIT_TRANSACTIONS ON 选择题 (1) 在SQL Server 2005中,事务的默认模式是哪一种。 A. 自动提交事务 B. 显示事务 C. 手动提交事务 D. 隐式事务 答案:A (2) 如果想要查看错误消息的完整文本,则应该使用哪个函数。 A. ERROR_NUMBER() B. ERROR_MESSAGE() C. ERROR_SEVERITY() D. ERROR_LINE() 答案:B (3) 在默认情况下,SQL Server 2005使用哪个事务隔离级别。 A. 未提交读 B. 已提交读 C. 可重复读 D. 可序列化 答案:B (4) 关于死锁的叙述中错误的是哪个。 A. 阻塞越少,发生死锁的机会就越少。 B. 死锁是指会导致永久阻塞的特殊阻塞场景。 C. 如果监视器检测到循环依赖关系,SQL Server将终止产生死锁的事务并提示错误。 D. 尽管死锁不能完全避免,但遵守特定的编码惯例可以将发生死锁的机会降至最低。 答案:C 判断题 (1) 事务的部分提交状态是指事务中的部分语句已执行成功并已提交。 答案:× (2) 在自动提交事务模式下,每个Transact-SQL语句都独立构成一个事务。

MySQL InnoDB存储引擎的事务隔离级别

MySQL InnoDB存储引擎的事务隔离级别 我们知道,在关系数据库标准中有四个事务隔离级别: 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞 查看InnoDB系统级别的事务隔离级别: 以下为引用的内容: mysql> SELECT @@global.tx_isolation; +-----------------------+ | @@global.tx_isolation | +-----------------------+ | REPEATABLE-READ | +-----------------------+ 1 row in set (0.00 sec) 查看InnoDB会话级别的事务隔离级别: 以下为引用的内容: mysql> SELECT @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec) 修改事务隔离级别: 以下为引用的内容:mysql> set global transaction isolation level read committed; Query OK, 0 rows affected (0.00 sec) mysql> set session transaction isolation level read committed; Query OK, 0 rows affected (0.00 sec) InnoDB的可重复读隔离级别和其他数据库的可重复读是有区别的,不会造成幻象读(phantom read),所谓幻象读,就是同一个事务内,多次select,可以读取到其他session insert并已经commit的数据。下面是一个小的测试,证明InnoDB的可重复读隔离级别不会造成幻象读。测试涉及两个session,分别为session 1和session 2,隔离级别都是repeateable read,关闭autocommit 以下为引用的内容: mysql> select @@tx_isolation;

第10章 事务复习要点

总体要点: 一事务执行原理 事务作为一个整体提交,在提交之前,所有的操作数据被临时存放起来,并没有保存到数据库中。任何一个操作错误,数据将回退(RollBack)到事务开始时的状态,临时更改被全部取消。事务提交后,数据更新才被实际保存到数据库。 关键点:如何捕捉到错误 二事务语法: BEGIN TRAN [事务名] 操作1 if 错误ROL LBACK 操作2 if 错误ROLLBACK …… COMMIT TRAN [事务名] 只要没有执行到Commit Tran语句,所有的数据更新都不会实际保存到数据库中。 三事务的ACID属性 ●原子性(Atomicity)——事务中的操作要么全成功,要么全回退。 ●一致性(Consistency)——事务执行前后数据在逻辑上是一致的。 ●隔离性(Isolation)——甲事务执行时,乙事务不能得到甲事务中间 的状态。即事务串行化,乙事务得到的数据要么是甲事务执行前

的状态,要么是执行后的状态。 ●持久性(Durability)——事务执行完后,对数据进行的更改将被保存。四事务的类型 ●显式事务用BEGIN TRAN开始事务,用COMMIT 提交事务, 用ROLLBACK回退事务。 ●自动提交事务是数据库引擎的缺省模式,每个单独的语句在 完成后被提交,失败后被回滚。 ●隐式事务在当前事务完成提交或回退后,新事务自动启动。 隐性事务不需要使用BEGIN TRAN 语句标识事务开始,但需要COMMIT或ROLLBACK语句来提交或回退事务。 练习: 1.并发操作可能带来的数据不一致性有( A)。[单选题] A、丢失修改、不可重复读、读脏数据 B、丢失修改、死锁、故障 C、丢失修改、不可重复读、冗余 D、故障、死锁、冗余 2.对于并发操作带来的数据不一致性,解决的办法是并发控制,主 要技术是( B)。[单选题] A、加密 B、封锁 C、转储 D、审计

SQLserver锁和事务隔离级别的比较与使用

SQLserver锁和事务隔离级别的比较与使用 对象 ①锁:每条SQL语句 ②隔离:事务 锁 ① 并发问题 丢失更新 未确认的读取(脏读) 不一致的分析(非重复读):多次读取相同的数据(行)不一致(其他用户更改update) 幻像读:多次读取有不存在和新增的数据(其他用户插入insert或删除delete) 隔离级别 幻像说明 隔离级别脏读不可重 复读取 未提交读(read uncommitted)是是是如果其他事务更新,不管是否提交,立即执行 提交读(read committed默认)否是是读取提交过的数据。如果其他事务更新没提交,则等待可重复读(repeatable read)否否是查询期间,不允许其他事务update 可串行读(serializable)否否否查询期间,不允许其他事务insert或delete

对数据已经具有排他锁(只能有一个),其他的事务就不能对锁定的数据获取共享锁和排他锁(即排他锁与共享锁不能兼容,更多信息请查看锁兼容性),在此特别强调一下锁定的数据,因为有的资料上讲解到“一个连接写的时候,另一个连接可以写”,实际上写的这种情况是各个连接的读写的数据不是相同的行,也就是说各个连接锁定的数据不同。 根据以上分析,我们总结为六个字为“共享读,排他写”。 了解了锁的情况之后,又涉及到一个问题。事务究竟要保持锁多久呢? 一般来说,共享锁的锁定时间与事务的隔离级别有关,如果隔离级别为Read Committed 的默认级别,只在读取(select)的期间保持锁定,即在查询出数据以后就释放了锁;如果隔离级别为更高的Repeatable read或Serializable,直到事务结束才释放锁。另说明,如果select语句中指定了HoldLock提示,则也要等到事务结束才释放锁。 排他锁直到事务结束才释放。 做出了以上分析,现在我们可能会存在这样的疑问,到底在执行SQL语句的时候发出什么样的锁呢,这就由事务的隔离级别决定了。一般情况,读语句(select)发出共享锁,写语句(update,insert,delete)发出排他锁。但是,如果这样不能满足我们的要求怎么办呢,有没有更多选择呢,别急,SQLserver为我们提供了锁定提示的概念。 锁定提示对SQL语句进行特别指定,这个指定将覆盖事务的隔离级别。下面对各个锁定提示分别予以介绍(更多资料请查看SQLserver的联机帮助),笔者做出了以下分类。 类型1 ①READUNCOMMITTED:不发出锁 ②READCOMMITTED:发出共享锁,保持到读取结束 ③REPEATABLEREAD:发出共享锁,保持到事务结束 ④SERIALIZABLE:发出共享锁,保持到事务结束 类型2 ①NOLOCK:不发出锁。等同于READUNCOMMITTED ②HOLDLOCK:发出共享锁,保持到事务结束。等同于SERIALIZABLE ③XLOCK:发出排他锁,保持到事务结束。 ④UPDLOCK:发出更新锁,保持到事务事务结束。(更新锁:不阻塞别的事物,允许别的 事物读数据(即更新锁可与共享锁兼容),但他确保自上次读取数据后数据没有被更新)⑤READPAST:发出共享锁,但跳过锁定行,它不会被阻塞。适用条件:提交读的隔离级别, 行级锁,select语句中。 类型3 ①ROWLOCK:行级锁 ②PAGLOCK:页级锁 ③TABLOCK:表锁 ④TABLOCKX:表排他锁 讲解完锁后,下面结合一个具体实例,具体看一下锁的使用。 在很多系统中,经常会遇到这种情况,要保持一个编号的唯一,如会计软件中的凭证的编号。一种编号的处理是这样的,把表中的最大编号保存到表中,然后在这个编号上累加,形成新的编号。这个过程对并发处理要求非常高,下面我们就来模拟这个过程,看如何保持编号的唯一性。 新建一张表code来保存凭证的最大编号。字段如下:编 号:bh(numeric(18,0)),凭证表名pinzheng(varchar(50)) 假设表中有这样的一条记录:

数据库事务与隔离示例

大家都知道,数据库事务的四大特性ACID(Atomic, Consistency, Isolation, Durability),这里主要考虑一致性和隔离性。为了提高事务的处理效率,通常并发的执行多个事务,这就是数据库中非常重要的‘并发控制’。简单说,并发的执行事务,会有以下问题: ?写丢失(Write Lost):比如事务A将x的值更新为10,然后事务A将y的值更新为20,这时A重新读取x发现自己更新过的数据似乎不见了。 ?脏读(Dirty Read):比如事务A的未提交(还依然缓存)的数据被事务B读走,如果事务A失败回滚,会导致事务B所读取的的数据是错误的; ?不可重复读(Non-repeatable Read):比如事务A中两处读取数据total的值。 在第一读的时候,total是100,然后事务B就把total的数据改成200,事 务A再读一次,结果就发现,total竟然就变成200了,造成事务A数据混 乱。 ?幻象(Phantom Read):和Non-Repeatable Read相似,也是同一个事务中多次读不一致的问题。但是Non-Repeatable Read的不一致是因为他所要取 的数据集被改变了(比如total的数据),但是Phantom Read所要读的数据 的不一致却不是他所要读的数据集改变,而是他的条件数据集改变。比如 Select account.id where https://www.wendangku.net/doc/ae17945411.html,="ppgogo*",第一次读去了6个符合 条件的id,第二次读取的时候,由于事务b把一个帐号的名字由"dd"改成 "ppgogo1",结果取出来了7个数据。 这四种问题呢,有些是可以忍的,有些解决后会大大滴降低并发性。所以,为了 适应不同的需求,SQL'92,规定了4种隔离级别,隔离级别越高,数据的一致性越好,数据库的并发性越低。 ?Serializable(全序列化,级别3)提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行 级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不 会被刚执行查询操作的事务访问到。 ?Repeatable Read(可重复读取,级别2)禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取 数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事 务。 ?Read Committed(授权读取,级别1):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许 其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访 问该行。 ?Read Uncommitted(未授权读取,级别0):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写 操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实 现。

MySQL-acid-mvcc以及=事物隔离级别

MySQL --- acid A:原子性> 保证一个事务为一个最小的单元,内部不可分割。 C:一致性> 保证事务中的每个操作线程不可单独提交,成功则一起提交,不成功则事务回滚; I : 隔离性> 保证不同事务间看到的数据视图相互独立,相互隔离。[ 提交读(read committed)和repeatable read(默认)] 这两个事物隔离级别的差别,就是当一个事物开始的时候,始终读取的信息是开始事物的那一刻的数据快照。这样的级别叫repeatable read,提交读就撒始终读取的是最近的数据。其他两个隔离叫未提交读(READ UNCOMMITTED) 和SERIALIZABLE(可串行化) 用的非常少,其中可串行化这个还使用其他的NoSQL队列来代替。 D:持久性> 保证事务提交后数据会持久的保存下来. Mysql的事务存储引擎Innodb 加锁机制叫多版本并发控制(MVCC)技术以便应对更高的并发,当然是以消耗性能作为代价。简单实现方式如下: InnoDB实现MVCC的方法是,它存储了每一行的两个(1)额外的隐藏字段,这两个隐藏字段分别记录了行的创建的时间和删除的时间。在每个事件发生的时候,每行存储版本号,而不是存储事件实际发生的时间。每次事物的开始这个版本号都会增加。自记录时间开始,每个事物都会保存记录的系统版本号。依照事物的版本来检查每行的版本号。在事物隔离级别为可重复读的情况下,来看看怎样应用它。 SELECT Innodb检查没行数据,确保他们符合两个标准:

1、InnoDB只查找版本早于当前事务版本的数据行(也就是数据行的版本必须 小于等于事务的版本),这确保当前事务读取的行都是事务之前已经存在的, 或者是由当前事务创建或修改的行 2、行的删除操作的版本一定是未定义的或者大于当前事务的版本号。确定了当 前事务开始之前,行没有被删除(2)符合了以上两点则返回查询结果。 INSERT InnoDB为每个新增行记录当前系统版本号作为创建ID。 DELETE InnoDB为每个删除行的记录当前系统版本号作为行的删除ID。 UPDATE InnoDB复制了一行。这个新行的版本号使用了系统版本号。它也把系统版本号作为了删除行的版本。 (1) 不是两个,是三个。1DB_TRX_ID:一个6byte的标识,每处理一个事务,其值自动+1,上述说到的“创建时间”和“删除时间”记录的就是这个DB_TRX_ID的值,如insert、update、delete操作时,删除操作用1个bit表示。 DB_TRX_ID是最重要的一个,可以通过语句“show engine innodb status”来查找。

db4

第四章数据库的保护 4.1 数据库的安全性 4.2 数据库的完整性 4.3 数据库的并发控制4.4 数据库的恢复 4.5 数据库的复制与镜像

4.1 数据库的安全性 ●数据库的安全性是指保护数据库以防止不合法的使用造成泄漏、更改或破坏等。●采用的方法有: –用户标识和鉴别–使用视图–数据加密 ●数据库系统的安全模型 –存取权限控制–审计 应用 DBMS OS DB 用户标识 存取控制 操作系统保护 密码存储

4.1.1用户标识和鉴别 ●一般由系统管理员(DBA)为每个用户建立一个用户名(用户标识/帐号)和用户口令。用户必须使用此标识方可进入系统 ●语法: CREATE USER IDENTIFIED BY ●二次登录问题

4.1.2存取控制 ●存取权限两要素: –数据对象 –操作类型 ●授权 –定义某用户对哪些数据对象具有哪些类型的操作●数据对象的粒度 –表、列、行(一般由视图实现) –粒度越细,授权子系统越灵活,安全性越完善。但系统开销越大,数据字典庞大

权限限制的种类 –对用户进行控制。 用户只可以访问自己的子模式 –对操作类型进行控制 操作一般包括:查询、修改、插入、删除等 用户可以被授予不同的操作权限 –对数据对象的控制 用户可以被限制访问某些表或表的列

权限组(角色)概念 –角色是数据库预先设置的一系列具有某种常用权限的组合。某用户属于一个角色就拥有该角色的所有权限了 SYBASE的一些角色 –sa_role –sso_role –sybase_ts_role –navigator_role

事务的四个特点

Oracle默认的隔离级别是read committed。 Oracle支持上述四种隔离级别中的两种:read committed 和serializable。除此之外,Oral ce中还定义Read only和Read write隔离级别。 Read only:事务中不能有任何修改数据库中数据的操作语句,是Serializable的一个子集。 Read write:它是默认设置,该选项表示在事务中可以有访问语句、修改语句,但不经常使用。设置一个事务的隔离级别: ?SET TRANSACTION ISOLATION LEVEL READ COMMITTED; ?SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

?SET TRANSACTION READ ONLY; ?SET TRANSACTION READ WRITE; 注意:这些语句是互斥的,不能同时设置两个或两个以上的选项。 设置单个会话的隔离级别: ?ALTER SESSION SET TRANSACTION ISOLATION LEVEL READ COMMITTED; ?ALTER SESSION SET TRANSACTION ISOLATION SERIALIZABLE; 锁分类 根据保护对象的不同,Oracle数据库锁可分为: ?DML lock(data locks,数据锁):用于保护数据的完整性。 ?DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义)。 ?Internal locks 和latches(内部锁与闩):保护内部数据库结构。 ?Distributed locks(分布式锁):用于OPS(并行服务器)中。 ?PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。 在Oracle中最主要的锁是DML锁,DML锁的目的在于保证并发情况下的数据完整性。在Or acle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。 锁出现在数据共享的场合,用来保证数据的一致性。当多个会话同时修改一个表时,需要对数据进行相应的锁定。 锁有“共享锁”、“排它锁”,“共享排它锁”等多种类型,而且每种类型又有“行级锁” (一次锁住一条记录),“页级锁” (一次锁住一页,即数据库中存储记录的最小可分配单元),“表级锁” (锁住整个表)。 6.2 共享锁(S锁) 可通过lock table in share mode命令添加该S锁。在该锁定模式下,不允许任何用户更新表。但是允许其他用户发出select …from for update命令对表添加RS锁。 6.3 排他锁(X锁) 可通过lock table in exclusive mode命令添加X锁。在该锁定模式下,其他用户不能对表进行任何的DML和DDL操作,该表上只能进行查询。 6.4 行级共享锁(RS锁)

数据库之事物隔离级别

事务隔离级别(transaction isolation levels ):隔离级别就是对对事务 并发控制的等级。实现技术:为了实现隔离级别通常数据库采用锁(Lock ),一般在编程的时候只需要设置隔离等级,至于具体采用什么锁则由数据库来设置。。 分类:ANSI / ISO SQL 将其分为串行化(SERIALIZABLE )、可重复读(REPEATABLE READ )、读已提交(READ COMMITED )、读未提交(READ UNCOMMITED )四个等级。 串行化(SERIALIZABLE ):所有事务都一个接一个地串行执行,但不能并发执行。 这样可以避免幻读(phantom reads )。 实现技术:对于基于锁来实现并发控制的数据库来说,串行化要求在执行范围查询(如选取年龄在10到30之间的用户)的时候,需要获取范围锁(range lock )。如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需要滚回该事务。 可重复读(REPEATABLE READ ):所有被Select 获取的数据都不能被修改。 这样就可以避免不可重复读(一个事务前后读取数据不一致的情况)。但是却没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据,因为前一个事务没有范围锁。 实现技术:通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。 读已提交(READ COMMITED ):被读取的数据可以被其他事务修改。 这样就可能导致不可重复读。也就是说,事务的读取数据的时候获取读锁,但是读完之后立即释放(不需要等到事务结束),而写锁则是事务提交之后才释放。释放读锁之后,就可能被其他事物修改数据。该等级也是SQL Server 默认的隔离等级。 实现技术:这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。 事务隔离级 transaction isolation levels 串行化读取 SERIALIZABLE 可重复读REPEATABLE 读已提交 READ COMMITED 读未提交 READ UNCOMMITED

SQL Server的四种事务隔离级别

简明扼要说明SQL Server的四种事务隔离级别 解决数据库并发读取错乱的途径之一就是使用事务进行操作,并且设置相应的事务隔离级别,现在就解释一下SQL Server的四种隔离级别。 SQL Server的四种隔离级别知识点整理,特别制作了流程图,方便以后查看! SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } 一、未提交读READ UNCOMMITTED(脏读) 意义:包含未提交数据的读。例如,在多用户环境下,用户B更改了某行。用户A在用户B 提交更改之前读取已更改的行。如果此时用户B再回滚更改,则用户A便读取了逻辑上从未存在过的行。 1)用户B: BEGIN TRAN UPDATE test SET age=25 WHERE name = ‘AA’ 2)用户A: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED(此句不写即默认为READ COMMITTED模式)

SELECT * FROM test(此时将查到AA的age值为25) 3)用户B: ROLLBACK(此时撤消了步骤1的UPDATE操作,则用户A读到的错误数据被称为脏读)二、提交读(READ COMMITTED) 意义:指定在读取数据时控制共享锁以避免脏读。此隔离等级的主要作用是避免脏读。 演示: 1)用户B: BEGIN TRAN UPDATE test SET age=25 W HERE name = ‘AA’ 2)用户A: SET TRANSACTION ISOLATION LEVEL READ COMMITTED SELECT * FROM test (上句设置了提交读模式,则此时将会查不到数据,显示查询等待中,直到用户B进行了ROLLBACK或者COMMIT操作后,此语句才会生效) 三、不一致的分析REPEATABLE READ(重复读) 意义:在多用户环境下,用户A开了一个事务,并且先对test表的某条记录做了查询(select * from test where name = ‘AA’),接着用户B对test表做了更新并提交(update test set age=25 where name=’AA’),这时A再去查test表中的这条记录,第一次读到的age值为12,第二次为25,两次读到的数据不一样,称之为重复读。 解决办法: 在用户A的事务运行之前,先设定SQL的隔离等级为REPEATABLE READ SQL语句为SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 这样在上图第一步中,用户A查询完之后,用户B将无法更新用户A所查询到的数据集中

标准SQL规范中定义的四个事务隔离级别(精)

标准 SQL 规范中定义的四个事务隔离级别 在标准 SQL 规范中,定义了 4个事务隔离级别,不同的隔离级别对事务的处理不同 : ◆未授权读取(Read Uncommitted :允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。 ◆授权读取 (Read Committed :允许不可重复读取, 但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。 ◆可重复读取(Repeatable Read :禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁” 和“排他写锁” 实现。读取数据的事务将会禁止写事务 (但允许读事务 ,写事务则禁止任何其他事务。 ◆序列化(Serializable :提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的, 必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。 隔离级别越高, 越能保证数据的完整性和一致性, 但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为 Read Committed ,它能够避免脏读取, 而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。 通过前面的介绍已经知道, 通过选用不同的隔离等级就可以在不同程度上避免前面所提及的在事务处理中所面临的各种问题。所以, 数据库隔离级别的选取就显得尤为重要, 在选取数据库的隔离级别时,应该注意以下几个处理的原则:

数据库原理试题及答案(五)

数据库原理试题及答案 一、单项选择题(本大题共15小题,每小题2分,共30分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.使用数据库技术来处理一个实际问题时,对数据描述经历的过程是( B ) A.定义、描述、实现 B.概念设计、逻辑设计、物理设计 C.结构设计、表设计、内容设计 D.逻辑设计、结构设计、表设计 2.负责DBS的正常运行,承担创建、监控和维护数据库结构责任的数据库用户是( D ) A.应用程序员 B.终端用户 C.专业用户 D.DBA 3.数据库应用系统设计的需求分析阶段生成的文档是数据字典和( A ) A.数据流图 B.E-R图 C.功能模块图 D.UML图 4.设有课程关系Course(课程号,课程名,学分,开设专业号,先修课程号)和专业关系Speciality(专业号,专业名),则课程关系Course的外键是( D ) A.课程号 B.开设专业号 C.先修课程号 D.开设专业号和先修课程号 5.由于关系模式设计不当所引起的插入异常指的是( C )

A.未经授权的用户对关系进行了插入操作 B.两个事务并发地对同一关系进行插入而造成数据库的不一致 C.由于码值的部分为空而不能将有用的信息作为一个元组插入到关系中 D.向关系中插入了不该插入的数据 6.X→Y能用FD推理规则推出的充分必要条件是( B ) A.Y?X B.Y?X+ C.X?Y+ D.X+=Y+ 7.下面关于SQL语言的描述中,不正确 ...的是( B ) A.SQL语言支持数据库的三级模式结构 B.一个SQL数据库就是一个基本表 C.SQL的一个表可以是一个基本表,也可以是一个视图 D.一个基本表可以跨多个存储文件存放,一个存储文件也可以存放一个或多个基本表 8.当关系R和S做自然连接时,能够把R和S原该舍弃的元组放到结果关系中的操作是 ( C )A.左外连接 B.右外连接 C.外连接 D.外部并 9.设有关系R(书号,书名),如果要检索书名中至少包含4个字母,且第3个字母为M的图 书,则SQL查询语句中WHERE子句的条件表达式应写成( C )A.书名LIKE '%_ _M%' B.书名LIKE '_ _M%'

Informix的事务、并发控制、锁机制、隔离级别

Informix的事务、并发控制、锁机制、隔离级别 1、事务 事务是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。数据库服务器保证在事务范围内执行的操作完整且正确地提交至磁盘,否则数据库会复原至事务启动之前的状态。 一个逻辑工作单元要成为事务,必须满足所谓的ACID属性。ACID的具体含义如下: 1)A(Atomicity):操作序列要么完整的执行,否则什么都不做; 2)C(Consistency):一致性,事务执行后,保证数据库从一个一致性状态到另外一个一致性状态; 3)I(Isolation):隔离,一个事务的中间状态对其他事务不可见,即每个用户都感觉他们在单独使用数据库。隔离级别用来定义多大程度的隔离多个不同的事务; 4)D(Durability):持久性,事务的有效性,不会应用硬件或软件的失败而丢失。 2、并发控制 1)相关概念 i)隔离(+一致性) => 并发控制; ii)多个事务可以访问或修改相同的资源; iii)只要多个进程共享资源,就需要对访问进程进行排队控制; iv)在进行并发控制时,数据库内部将生成多个并发事务访问资源的操作序列表,并且每一个事务内部的各个操作都需要序列化。 2)串行调度存在的问题 在串行调度中,采用操作序列,一个事务完成了再完成另外一个,即使两个事务T1、T2更新的是数据库中不同的对象。此种方式从并发和性能角度考虑,都不能很好的利用计算机资源。 为了改善性能,需要采用非串行调度,即允许事务并发执行,即一个事务内的操作可以在其他事务提交前开始执行。 3)并发调度的常见问题 i)脏读:事务T2读取到了事务T1没有提交的结果 例如如下的操作序列会导致脏读: 事务T1读取记录,然后更新记录; 事务T2读取了更新后的记录;

Spring事务隔离级别

Spring事务隔离级别 本文将介绍Spring事务隔离级别,Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。 AD: 一、Propagation : key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。 有以下选项可供使用:PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY 支持当前事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。 1:PROPAGATION_REQUIRED 加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务

比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候, ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA 的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。 这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚。 2:PROPAGATION_SUPPORTS 如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行。 3:PROPAGATION_MANDATORY 必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常。 4:PROPAGATION_REQUIRES_NEW 这个就比较绕口了。比如我们设计ServiceA.methodA的事务级别为 PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为 PROPAGATION_REQUIRES_NEW,那么当执行到ServiceB.methodB的时候, ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后,他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。因为ServiceB.methodB是新起一个事务,那么就是存在两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。 5:PROPAGATION_NOT_SUPPORTED

数据库原理期末标准试题第5套及标准答案(格式绝对符合标准)

数据库原理试题E 考试时间:120分钟 一、单选题(每小题后的四个备选答案中只有一个是正确的,请将你认为正确的那个编号填入题目的括号内。每小题 1分,本大题共15分。) 1、下面对数据模型的不正确叙述是( )。 A .数据模型是用来表示数据及数据之间联系的。 B .数据模型可分为三个层次:概念模型、逻辑模型、物理模型。 C .逻辑层次上的数据模型有三个要素:数据结构、数据操作、数据完整 性约束。 D .到目前为止,逻辑数据模型只有:层次模型、网状模型、关系模型。 2、下面对数据库三级模式结构的叙述中,不正确的是( )。 A .三级模式结构可提供数据独立性。 B .三级模式结构通过两级映象来实现数据独立性。 C .模式做了修改,用户的应用程序必须修改。 D .内模式做了修改,模式不一定修改。 3、下面对“关系模型”的叙述中,不正确的说法是( )。 A .关系模型的数据结构就是关系。 B .关系是一个属性数目相同的元组集合。 C .关系模型允许在关系中出现两条完全相同的元组。 D .关系模型具有三类完整性约束。 4、下面对关系“键”概念的不正确叙述是( )。 A .一个关系只能有一个候选键。 B .候选键是指在一个关系中,能够唯一标识每个元组且不含多余属性的属 性集。 C .一个关系模式只能有一个“主键”。

D.候选键再添加一个属性便可构成一个“超键”。 5、设关系R和S的属性集相同,W是R的属性集的子集,下面不正确的等式是()。 A.πW(R-S)=πW(R)-πW(S) B.σ(F)(R-S)=σ(F)(R)-σ(F)(S) C.σ(F)(R∪S)=σ(F)(R)∪σ(F)(S) D.πW(R∪S)=πW(R)∪πW(S) 6、在关系模式R(U)中,X?U,Y?U,X→Y,且Y不能决定X,则X 与Y之间的关系是()。 A.一对一B.一对多C.多对多D.多对一 7、下面对3NF的叙述中,不正确的说法是()。 A.3NF模式中不存非主属性对侯选键的传递依赖。 B.3NF中的任何一个函数依赖X→Y,都有Y∈X。 C.如果模式R是3NF,那么R一定是2NF。 D.3NF中的任何一个非平凡函数依赖FD X→Y,若X不是超键则X必然是主属性。 8、在()组织结构中,记录一般是以输入顺序为序存储的。A.顺序文件B.堆文件C.散列文件D.聚集文件 9、下面关于“索引”概念的不正确叙述是()。 A.索引能够提高查询效率。 B.索引的组织方式主要有线性索引和树形索引两种。。 C.主索引的索引顺序与主文件的记录存储顺序保持一致。 D.由于索引能提高查询速度,所以对一个表来说:“索引建的越多越好”。 10、下面不属于系统目录内容的是()。 A.模式、内模式、外模式之间的映像。 B.安全性规则、完整性规则。 C.事务日志。 D.索引的定义信息。

SQL Server的四种隔离级别

SQL Server的四种隔离级别知识点整理 特别制作了流程图,方便以后查看! SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } 一、未提交读READ UNCOMMITTED(脏读) 意义:包含未提交数据的读。例如,在多用户环境下,用户B更改了某行。用户A在用户B 提交更改之前读取已更改的行。如果此时用户B再回滚更改,则用户A便读取了逻辑上从未存在过的行。(如图演示) 演示: 1)用户B: BEGIN TRAN UPDATE test SET age=25 WHERE name = ‘AA’ 2)用户A: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED(此句不写即默认为READ COMMITTED 模式) SELECT * FROM test(此时将查到AA的age值为25)

3)用户B: ROLLBACK(此时撤消了步骤1的UPDATE操作,则用户A读到的错误数据被称为脏读) 二、提交读(READ COMMITTED) 意义:指定在读取数据时控制共享锁以避免脏读。此隔离等级的主要作用是避免脏读。 演示: 1)用户B: BEGIN TRAN UPDATE test SET age=25 WHERE name = ‘AA’ 2)用户A: SET TRANSACTION ISOLATION LEVEL READ COMMITTED SELECT * FROM test (上句设置了提交读模式,则此时将会查不到数据,显示查询等待中,直到用户B进行了ROLLBACK或者COMMIT操作后,此语句才会生效) 三、不一致的分析REPEATABLE READ(重复读) 意义:在多用户环境下,用户A开了一个事务,并且先对test表的某条记录做了查询(select * from test where name = ‘AA’),接着用户B对test表做了更新并提交(update test set age=25 where name=’AA’),这时A再去查test表中的这条记录,第一次读到的age 值为12,第二次为25,两次读到的数据不一样,称之为重复读。(如图演示) 解决办法: 在用户A的事务运行之前,先设定SQL的隔离等级为REPEATABLE READ SQL语句为SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

相关文档
相关文档 最新文档