事务T1中有两次查询学生表中的男生人数,在这两次查询执行中间,事务T2对学生表中

考试题库2022-08-02  52

问题 事务T1中有两次查询学生表中的男生人数,在这两次查询执行中间,事务T2对学生表中加入了一条男生记录,导致T1两次查询的结果不一致,此类问题属于(  ),为解决这一问题,应采用的隔离级别是(  )。问题1选项A.可重复读B.读脏数据C.丢失修改D.幻影现象问题2选项A.Read UncommittedB.Read CommittedC.Repeatable ReadD.Serializable

选项

答案 DD

解析 并发操作可能导致:丢失更新、不可重复读、读“脏”数据等问题。
丢失更新是指两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。
不可重复读是指事务T1读取数据后,事务T2执行更新操作,是T1无法再现前一次读取结果。
(1)事务T1,事务T2对其做了修改,事务T1再次读。
(2)事务T1按一定条件从数据库中读,事务T2删除了其中部分记录,当T1再次按相同的条件读。
(3)事务T1按一定条件从数据库中读,事务T2插入了一些记录,当T1再次按照相同条件读。
读“脏”数据是指事务T1修改某一数据并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时T1修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,即T2读到了“脏”数据。
为了避免出现并发的几种情况,在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。
未授权读取:也称为读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排它写锁”实现。
授权读取:也称为读提交(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排它写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排它写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
转载请注明原文地址:https://tihaiku.com/congyezige/2419702.html

最新回复(0)