软考-软件设计师:数据库技术基础-事务、并发控制(脏读、幻读、不可重复读、锁)

事务特性

  • 原子性。事务是原子的,要么都做,要么都不做。

  • 一致性。事务执行的结果必须保证数据库从一个一致性状态变到另一个一致性状态。

  • 隔离性。当多个事务并发执行时,任一事务的更新操作直到其成功提交的整个过程,对其他事务都是不可见的。

  • 持久性。一旦事务成功提交,即使数据库崩溃,其对数据库的更新操作也将永久有效。

详见:
https://www.malaoshi.top/show_1EF3uCskLf9s.html

并发的问题

  • 丢失修改:T1做减1,T2做减一,T1写入、T2写入,只减1次
    如图9-30(a)所示,事务T、T2都是对数据A做减1操作。事务T在时刻t把 A 修改后的值 15 写入数据库,但事务 T2在时刻t,再把它对A减1后的值 15 写入。两个事务都是对A的值进行减1操作并且都执行成功,但A中的值却只减了1。例如火车售票系统,T与T2各售出了一张票,但数据库里的存票却只减了一张,造成数据的不一致。原因在于T,事务对数据库的修改被T2事务覆盖而丢失了,破坏了事务的隔离性。

  • 不可重复读:两次读取数据不一致:T1读取,T2修改,T1再次读取
    如图9-30(b)所示,事务T,读取 A、B 的值后进行运算,事务T2在to时刻对B 的值做了修改以后,事务T又重新读取A、B 的值再运算,同一事务内对同一组数据的相同运算结果不同,显然与事实不相符。同样是事务T2干扰了事务T 的独立性。

  • 读脏数据:T1修改,T2读取修改后的数据,T1回滚
    如图9-30(c)所示,事务T1对数据C修改之后,在t4时刻事务T2读取修改后的C值做处理,之后事务T回滚,数据C恢复了原来的值,事务T2对C所做的处理是无效的,它读的是被丢掉的垃圾值。

解决

通过 并发控制 解决

并发控制

S锁(共享锁/读锁)加锁规则

若事务T对数据 对象A 加上 S锁,其他事务只能对 A 加 S锁,不能再对 A 添加 X锁

其他事务 只能读、不能写

X锁(写锁/排他锁/独占锁)的加锁规则

若事务T对数据 对象A 加上 X锁,其他事务对A 不能再添加任意锁

其他事务 不能读、不能写

题

事务的()是指,当某个事务提交交(COMMIT)后,对数据库的更新操作可能还停留在服务器磁盘缓冲区而未写入到磁盘时,即使系统发生故障,事务的执行结果仍不会丢失。

A、原子性
B、一致性
C、隔离性
D、持久性

答案

D

题

系统中有三个事务T1、T2、T3分别对数据R1和R2进行操作,其中R1和R2的初值R1=120、R2=50。假设事务T1、T2、T3操作的情况如下图所示,图中T1与T2间并发操作( )问题,T2与T3间并发操作( )问题。

A、不存在任何
B、存在T1不能重复读的
C、存在T1丢失修改的
D、存在T2读“脏”数据的

A、不存在任何
B、存在T2读“脏”数据的
C、存在T2丢失修改的
D、存在T3丢失修改的

答案

第一问:B,因为 T1 两次读取的R2不同

第二问:C

题

若事务T1对数据D1加了共享锁,事务T2、T3分别对数据D2和数据
D3加了排它锁,则事务务()

A、T1对数据D2D3加排它锁都成功,T2T3对数据D1加共享锁成功
B、T1对数据D2D3加排它锁都失败,T2T3对数据D1加排它锁成功
C、T1对数据D2D3加共享锁都成功,T2T3对数据D1加共享锁成功
D、T1对数据D2D3加共享锁都失败,T2T3对数据D1加共享锁成功

答案

D


原文出处:/show_1GW12RadjLLo.html