两段锁协议和触发器相关面试题问题以及对应的参考答案

两段锁协议和触发器相关问题解答

两段锁协议相关问题

1. 两段锁协议如何保证可串行化?

两段锁协议(2PL)通过限制事务获取和释放锁的顺序来保证可串行化:

  • 扩展阶段:事务只能获取锁,不能释放任何锁
  • 收缩阶段:事务只能释放锁,不能再获取任何新锁

这种限制确保了事务之间的冲突操作(读/写、写/读、写/写)会以相同的顺序发生,从而产生等价于某个串行调度的执行顺序。

2. 严格两段锁协议与基本两段锁协议的区别?

主要区别在于锁释放的时机:

  • 基本两段锁协议:只需要满足"先获取所有锁,再释放任何锁"的两阶段要求
  • 严格两段锁协议:除了满足两阶段要求外,还要求所有排他锁(X锁)必须保持到事务结束才释放

严格2PL避免了级联回滚问题,因为其他事务无法读取未提交的数据。

3. 两段锁协议会导致什么并发问题?

两段锁协议可能导致以下并发问题:

  • 死锁:多个事务互相等待对方持有的锁
  • 级联回滚(基本2PL中):一个事务回滚可能导致依赖它数据的事务也必须回滚
  • 并发度降低:严格的锁协议会限制系统的并发性能

4. 如何解决两段锁协议可能导致的死锁问题?

解决死锁的常用方法包括:

  • 死锁预防:如按固定顺序获取锁、要求一次性获取所有锁
  • 死锁检测与恢复:使用等待图检测死锁,选择牺牲者回滚
  • 超时机制:锁等待超过阈值后回滚事务
  • 锁升级:将多个细粒度锁升级为更少、更粗粒度的锁
  • 乐观并发控制:对冲突较少的环境,可以使用乐观方法替代2PL

触发器相关问题

1. BEFORE触发器和AFTER触发器的适用场景?

  • BEFORE触发器适用场景

    • 需要在操作执行前验证数据有效性
    • 需要修改即将插入或更新的数据值
    • 需要在删除前记录将被删除的数据
  • AFTER触发器适用场景

    • 需要在操作完成后记录审计信息
    • 需要在数据变更后执行级联操作
    • 需要在操作完成后通知其他系统

2. 行级触发器和语句级触发器的区别?

主要区别在于触发时机和执行次数:

  • 行级触发器

    • 对受影响的每一行数据都会触发一次
    • 可以访问行的旧值和新值
    • 适用于需要对每行数据进行特定处理的场景
  • 语句级触发器

    • 整个SQL语句执行只触发一次,无论影响多少行
    • 不能直接访问行的旧值和新值
    • 适用于不需要行级细粒度控制的批量操作

3. 触发器中如何访问旧值和新值?

在大多数数据库系统中:

  • 对于UPDATE操作:
    • :OLD表示修改前的行值
    • :NEW表示修改后的行值
  • 对于INSERT操作:
    • 只有:NEW有效,表示新插入的行
  • 对于DELETE操作:
    • 只有:OLD有效,表示被删除的行

具体语法可能因数据库系统而异,例如在SQL Server中使用inserteddeleted逻辑表。

4. 触发器的优缺点是什么?什么情况下应该避免使用触发器?

优点

  • 自动执行,确保业务规则一致
  • 简化应用代码,集中业务逻辑
  • 提供审计跟踪能力
  • 可以实现复杂的数据完整性约束

缺点

  • 隐式执行,可能导致难以调试的问题
  • 增加系统开销,可能影响性能
  • 可能导致意外的连锁反应
  • 使业务逻辑分散,难以维护

应避免使用触发器的情况

  • 性能关键路径上的操作
  • 逻辑过于复杂或耗时长的操作
  • 可以用简单约束实现相同功能时
  • 需要明确控制事务边界的情况
  • 系统已存在大量触发器,可能产生不可预测的交互时

你可能感兴趣的:(数据库,数据库)