首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【高性能MySQL】事务

【高性能MySQL】事务

原创
作者头像
用户9295575
修改2025-01-01 19:46:07
修改2025-01-01 19:46:07
2310
举报

事务的ACID概念相信大家都很熟悉了。这里简单带过。

  • 原子性:一个事务被视为一个不可分割的最小单元。整个事务中的所有操作要么全部提交成功,妖媚全部失败回滚。
  • 一致性:数据库总是从一个一致性状态转换到另一个一致性的状态。
  • 隔离性:通常来说,一个事务所做的修改在最终提交前,对其他事务是不可见的。(为什么是通常来说,可以详见下面的隔离级别)
  • 持久性:一旦事务提交,则其所作的修改就会永久保存在数据库中。持久性是个有点模糊的概念,持久性也分很多种不同的级别。有些持久性策略能够提供非常强的安全保障,有些不能。

就像锁粒度的升级会增加系统开销一样,事务处理过程中也会增加服务器的开销。需要更强的CPU,更大的内存和磁盘空间。用户可以根据业务是否需要事务,来选择合适的存储引擎。

本节第一个要分享的点:隔离级别

SQL标准中定义了4种隔离级别。每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间可见,哪些不可见。较低级别的隔离通常可以执行更高的并发。系统开销也更低。

  • 未提交读(READ UNCOMMITTED)事务中的修改,即使没有没有提交,对其他的事务也都可见。事务可以读取未提交的数据,也叫脏读。开销也不小,性能也不高。
  • 提交读(READ COMMITTED)一个事务开始到提交之前,所作的任何修改对其他事务不可见。这个级别也叫做不可重复读。因为两次执行同样的查询,得到的结果可能不一样。
  • 可重复读(REPEATABLE READ)解决了都脏的问题。保证在同一个事务中多次读取同样的查询,得到的结果一样。但会出现幻读的问题。所谓幻读是,一个事务在读取某个范围内数据,另一个事务在这个范围内插入了新的数据,当之前的事务再次读取该范围内的记录时,会产生幻行。
  • 可串行化(SERIALIZABLE)是最高的隔离级别。会在读取的每一行上加锁,避免了幻读,但是会带来大量的超时和锁争用问题。实际应用中很少用到这个级别。

第二个分享的点:死锁

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务以不同的顺序锁定资源时,可能会发生死锁。多个事务同时锁定同一个资源时,也会产生死锁。

如何解决死锁呢?数据库系统实现了各种死锁检测和死锁超时机制。越复杂的系统,比如InnoDB存储引擎,越能检测到死锁的循环依赖,并立即返回一个错误。这种解决方式很有效,否则死锁会导致出现非常慢的查询。还有一种解决方式,将持有最少行级排他锁的事务进行优先回滚,InnoDB目前采用的这种。对于事务型的系统,死锁是不可避免的,应用程序设计时需要考虑如何处理死锁。大多数情况下只需要重新执行因死锁回滚的事务即可。

每天学习一点,每天进度一点!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档