数据库事务与并发控制 - 软考备战(三十二)
数据库系统四参考资料一篇讲透如何理解数据库并发控制纯干货 - 知乎封锁数据库中的封锁_百度百科史上最全 MySQL 锁详解从理论到实战一篇搞定所有锁机制-腾讯云开发者社区-腾讯云数据库事务与并发控制梳理一并发控制是OLTP型数据库管理系统的核心技术之一本系列文章从基本概念和原理出发梳理总结 - 掘金5.4 数据库事务与并发控制命令核心功能简要说明COMMIT提交将事务内的所有修改永久保存到数据库。ROLLBACK回滚撤销事务内所有未提交的修改恢复到事务开始前或某个保存点。SAVEPOINT设置保存点在事务中设置一个标记允许后续ROLLBACK到此点而非全部回滚。SET TRANSACTION设置事务特性用于定义事务的隔离级别和访问模式只读/读写控制并发行为huaweicloud.com1。1. 事务的概念和 ACID 特性事务是数据库操作的最小逻辑工作单元由一组 SQL 组成要么全做要么全不做。A (Atomicity 原子性)不可分割要么全成功要么全失败回滚。底层靠Undo Log 回滚日志保证。C (Consistency 一致性)事务前后数据库从一个正确状态转到另一个正确状态如转账前后总额不变。注意一致性是业务层面的目的它是 A、I、D 共同努力的结果没有单独的机制直接保证它I (Isolation 隔离性)并发事务之间互不干扰仿佛是串行执行的。底层靠锁机制并发控制保证。D (Durability 持久性)事务一旦提交对数据的改变是永久的哪怕立刻断电也不丢。底层靠Redo Log 重做日志冗余保证。2. 并发操作带来的问题丢失修改写-写冲突两事务同时读并修改同一数据后提交的覆盖了先提交的。特征两人都改最后只保留了一个人的修改。脏读读-写冲突事务A改了数据但还没提交事务B读到了这个中间数据。如果A回滚了取消修改的操作B读的就是无效的“脏数据”。特征读到了未提交的数据。不可重复读读-写冲突事务B在读数据期间事务A修改UPDATE了数据并提交导致事务B在同一事务内前后两次读到的值不一样。特征针对同一行数据内容变了。幻读读-写冲突事务B在读数据期间事务A插入/删除INSERT/DELETE了数据并提交导致事务B前后两次读到的数据行数不一样。特征针对同一范围查询行数变了像见鬼一样。3. 封锁技术共享锁S锁读锁事务读数据加S锁。相容性S锁与S锁相容可以多个事务同时读S锁与X锁互斥别人读的时候你不能写。排他锁X锁写锁事务写数据加X锁。相容性X锁与任何锁都互斥只要有人写其他任何人既不能读也不能写独占。4. 封锁协议一级封锁协议修改数据时加X锁直到事务结束才释放。- 解决丢失修改。读数据不加锁所以防不了脏读。二级封锁协议在一级基础上读数据前加S锁读完立即释放S锁。- 解决丢失修改 脏读。因为读完就释放S锁所以别人中间还能改防不了不可重复读。三级封锁协议在一级基础上读数据前加S锁直到事务结束才释放S锁。- 解决丢失修改 脏读 不可重复读。注意传统三级协议解决不了幻读需要靠“Next-Key Lock”等高级机制。两段锁协议2PL定义所有事务必须分两个阶段对数据项加锁和解锁。扩展阶段加锁阶段只能加锁不能解锁。收缩阶段解锁阶段只能解锁不能加锁。遵守两段锁协议一定能够保证并发事务调度的“可串行化”。即结果等同于串行执行保证正确性。但是可能发生死锁。因为扩展阶段大家都抢着加锁容易形成循环等待。5. SQL 标准隔离级别现代数据库实际使用的分类Read Uncommitted读未提交最低级别啥也不防。会导致脏读、不可重复读、幻读。Read Committed读已提交解决脏读。Oracle/SQL Server 默认级别相当于实现了二级封锁协议。Repeatable Read可重复读解决脏读 不可重复读。注意MySQL InnoDB 引擎默认级别。InnoDB在此级别通过 MVCC间隙锁额外解决了幻读问题但理论上此级别允许幻读。Serializable串行化最高级别解决所有并发问题包括幻读。事务完全排队串行执行性能极差。6. 死锁与封锁粒度死锁具体内容链接进程管理 - 软考备战十七-CSDN博客死锁预防一次性申请全部锁太粗暴、按序号顺序申请锁。死锁诊断与解除超时法简单但可能误判、等待图法画有向图有环即死锁。唯一解除方法选择一个代价最小如已执行时间最短、改动数据最少的事务进行撤销释放它的锁让其他事务继续。封锁粒度权衡的艺术粗粒度表级锁开销小管理简单但并发度低锁住整张表别人啥也干不了。细粒度行级锁/列级锁开销大需要维护大量锁状态但并发度高只锁一行别人可以改其他行。趋势现代数据库如 MySQL默认支持行级锁以追求高并发。