ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【数据库】事务

2026/8/17 21:18:34 拓冰建站 浏览量
【数据库】事务 第八章 事务文章目录第八章 事务前言一、 事务的ACID特型二、如何使用事务三、事务的隔离性和隔离级别四、查看和修改隔离型五、不同隔离级别存在的问题1. 脏读2. 不可重复读3. 幻读总结前言事务就是针对一组SQL呈现的效果是要么都不执行要么全都执行 .其中的机制是靠回滚运行过程中会对上述增删改查操作记录一个日志~~如事务正常执行日志就会删除如执行到一半出现故障再次启动的时会查询日志内容并根据做的操作把保存的数据还原回去恢复如初一、 事务的ACID特型这里需要背下来!!!Atomicity(原子性) :把多个SQL打包成一个整体 . 要么全都执行完要么一个都不执行.(一个都不执行是通过回滚机制实现的不是真没执行而是通过回滚还原成最初的状态了)Consistency(一致性) :一个事务执行前和执行后数据得是合理的靠谱的~~(事务的执行不能破坏数据的完整性)Isolation (隔离性) :一个数据库服务器可以同时执行多个客户端提交的事务~~并且这些事务之间产生的影响尽量小(隔离性非常重要 , 下面会单独讲解)Durability(持久性):事务对于数据库做出的修改都是持久的”数据保存在硬盘上.重启服务器重启数据库都不会使数据丢失~~二、如何使用事务开启事务start transaction;回滚 :rollback;保存点 : (可以回滚到到保存点)savepoint 名字1;回滚到保存点 :rollback to 名字1 ;提交事务 : (已经提交过的就不能回滚了)commit ;三、事务的隔离性和隔离级别事务具有隔离性 , 不同的隔离程度 , 称为事务的隔离级别有四种 :READ UNCOMMITTED , 读未提交READ COMMITTED , 读已提交REPEATABLE READ , 可重复读 (默认级别)SERIALIZABLE , 串行化不同隔离级别存在不同问题 , 如 脏读 , 不可重复读 , 幻读隔离级别脏读不可重复读幻读READ UNCOMMITTED有有有READ COMMITTED没有有有REPEATABLE READ没有没有有SERIALIZABLE没有没有没有从上往下 , 隔离力度(安全性)越来越高 , 并发性越来越弱四、查看和修改隔离型这些语句不用背下来 , 到时候查就可以~~查看隔离级别 :SELECT GLOBAL.transaction_isolation ;修改隔离级别语句 :SET GLOBAL transaction_isolation ’ 隔离级别 ’ ;一般实际开发中不会这么做 , 这种设置方式只是临时的 , 真正是通过配置文件来修改的五、不同隔离级别存在的问题以下为示范 , 如更改隔离级别后自行操作时未能达到期望效果 , 可尝试把连接2断开重连1. 脏读隔离级别 :读未提交 READ UNCOMMIT连接1 : 开启事务 , 修改数据但不提交连接2 : 开启事务 , 连接1中的修改的数据还没有提交 , 但查询到的结果为修改后的解决脏读提升隔离级别 : 读已提交 READ COMMITE连接1 : 开启事务 , 更改 id4连接2 : 连接1中没有commit , 此处查询到的仍是修改前的数据 , 没有脏读2. 不可重复读隔离级别 : 读已提交 READ COMMITTED连接2 : 查询 str9连接1 : 修改数据并提交连接2 : 再次查询 , 读到的结果和第一次不一样解决不可重复读提升隔离界别 : 可重复读 REPEATABLE READ连接2 : 开启事务 , 并查询 str9连接1 : 修改数据并提交连接2 : 再次查询 , 结果与第一次相同3. 幻读隔离级别 : 不可重复读 REPEATABLE READ连接2 : 开启事务并查询连接1 : 新增数据并提交连接2 : 再次查询 , 没有出现幻读 , 因为可重复读隔离级别本身已经能处理大部分幻读情况那怎么让它出现呢 ? str3 中id为主键不可重复 , 因此我们新增连接1中插入的 id 看看能不能成功~~失败了 , 内置查询会发现这个数据已经存在 , 我们称这也相当于幻读解决幻读问题提升隔离级别 : 串行化 SERIALIZABLE连接2 : 开启事务并查询连接1 : 进行插入 ,发现并没有成功 , 连接2事务没有执行完 , 连接1事务只能等 , 一段时间之后就会失败~~连接2 : 重新开启一个事务连接1 : 也开启一个事务 , 并进行插入 , 发现指令没有立刻执行连接2 : 插入一行相同的数据并提交连接1 : 开始执行了 , 但因为 id 为主键插入失败总结哇 , 终于要学完数据库了 , 加油 !!!