💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
[TOC] ## 事务处理 > MySql 提供事务处理的表引擎, `InnoDB` > 服务器层不管理事务,由下层的引擎实现,所以在同一个事务中,使用多种存储引擎不靠谱。 > 在非事务的表上执行事务操作 MySql不会发出提醒,也不会报错 ## 什么是事务 > 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点。 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约束没有被破坏 持久性:事务的提交结果,将持久保存在数据库中 ## 为什么会产生死锁? 在数据库的上下文中,死锁是指两个或多个事务无法进行的情况,因为每个事务都在等待另一个事务释放资源。这可以类比为事务的[循环链],每个事务都在等待链中的下一个事务释放资源。 ![](https://img.kancloud.cn/c7/28/c728f556c6df0ff890b9fa0d4d8e75d0_1080x284.png) ## 避免死锁 这涉及到谨慎的资源调度,其中[数据库系统]提前检查以检测潜在的死锁情况并防止它们发生。然而,这需要了解未来的处理请求,这通常是不可能的。 ## 预防死锁 这种策略涉及到设计一个系统,使得死锁条件不能成立。这可以通过防止至少一个Coffman[死锁条件]来实现,这四个条件是:相互排斥、占有和等待、[非抢占]、循环等待。 ## 隔离级别 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | | --- | --- | --- | --- | | Read uncommitted (读未提交) | √ | √ | √ | | Read Committed (读已提交) | ✘ | √ | √ | | Repeatable Reads (可重复读) | ✘ | ✘ | √ | | Serializable (串行化) | ✘ | ✘ | ✘ | **类型一:RU(READ-UNCOMMITTED 表示读未提交)** > 可以读取到事务未提交的数据,隔离性差,会出现脏读(当前内存读),不可重复读,幻读问题; **类型二:RC(READ-COMMITTED 表示读已提交)** 可用 > 可以读取到事务已提交的数据,隔离性一般,不会出现脏读问题,但是会出现不可重复读,幻读问题; **类型三:RR(REPEATABLE-READ 表示可重复读)** `默认` > 可以防止脏读(当前内存读),防止不可重复读问题,防止会出现的幻读问题,但是并发能力较差; 会使用next lock锁进制,来防止幻读问题,但是引入锁进制后,锁的代价会比较高,比较耗费CPU资源,占用系统性能; **类型四:SR(SERIALIZABLE 可串行化)** > 隔离性比较高,可以实现串行化读取数据,但是事务的并发度就没有了; 这是事务的最高级别,在每条读的数据上,加上锁,使之不可能相互冲突 读取未提交