【MySQL】事物认识

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL】事物认识

概念


本事上是使用行级锁实现(排它锁,共享锁)

事物处理可以确保非事物性单元内的所有操作都成功完成,否则不会永远更新面向数据的资源。通过将这一组相关操作组合成为一个要么全部成功要么全部失败的的单元,可以简化错误恢复病史应用程序更加可靠。一个逻辑单元要成为事物,必须满足所谓的acid属性

属性

原子性

对于数据修改,要么全部都执行,要么全都不执行

隔离性

在所有的操作没有执行完毕之前,其他回话不能够看到中间改变的过程

案例:

我们打开俩个查询器,然后同时对一个表进行数据计算总值。可以看到起初的数据是一样的

屏幕快照 2022-05-16 下午11.12.57.png屏幕快照 2022-05-16 下午11.13.09.png屏幕快照 2022-05-16 下午11.13.16.png

一致性

事物发生前和发生后,根据数据的规则,总额应该匹配

持久性

事物一旦被提交,其结果就是永久性的,系统崩溃也不会影响

执行过程


因为MySQL5之后通常的默认存储引擎是InnoDB所以,以InnoDB为例讲解实现过程

MySQL在进行事务处理的时候使用的是日志现行的方式来保证事务可快速和持久运行的,也就是在写数据库前,需要先写日志。当开始一个事务时,会记录该事物的一个LSN日志序列号;当执行事务时,会往InnoDB_Log_Buffer 日志缓冲区里插入事务日志(redo log);当事务提交时,会将日志缓存区里的事务日志刷入磁盘。这个动作主要是由innodb_flush_log_at_trx_commit这个参数控制的。

发出commit动作时。已经说明过,commit发出后是否刷日志由变量 innodb_flush_log_at_trx_commit 控制。

每秒刷一次。这个刷日志的频率由变量 innodb_flush_log_at_timeout 值决定,默认是1秒。要注意,这个刷日志频率和commit动作无关。

当log buffer中已经使用的内存超过一半时。

当有checkpoint时,checkpoint在一定程度上代表了刷到磁盘时日志所处的LSN位置。

可以通过命令

show engine innodb status\G;

Log sequence number 8619676075 (表示当前的LSN日志序列号)


Log flushed up to 8619676075 (表示刷新到事物日志的LSN日志序列号)


Last checkpoint at 8619676075 (表示刷新到磁盘的LSN日志序列号)

除了记录事务日志意外,数据库还会记录一定量的撤销日志(undo log), undo与redo正好相反,在对数据进行修改时,由于某种原因失败了,或者人为执行了rollback回滚语句,就可以利用这些撤销日志将数据回滚到修改之前的样子。redo日志保存在ib_logfile0/1/2里,而undo日志保存在ibdata1里,在MySQL5.6里还可以把undo日志单拆分出去。


对于事务的建议


innodb存储引擎由于实现了行几所,颗粒更小,实现更复杂。但是innodb行锁在并发性能上远远要高于表锁页锁。在使用方面可以尽量做到以下几点;


控制事务大小,减少锁定的资源量和锁定时间长度。

人所有的数据检索都通过索引来完成,从而避免因为无法通过索引加锁而升级为表锁。

减少基于范围的数据检索过滤条件,避免因为间隙锁带来的负面影响而锁定了不该锁定的数据。

在业务条件允许下,尽量使用较低隔离级别的事务隔离。减少隔离级别带来的附加成本。

河里使用索引,让innodb在索引上面加锁的时候更加准确。

在应用中尽可能做到访问的顺序执行

如果容易死锁,就可以考虑使用表锁来减少死锁的概率


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL Oracle 关系型数据库
Mysql模拟事物的隔离级别【脏读、不可重复读、幻读】
Mysql模拟事物的隔离级别【脏读、不可重复读、幻读】
205 0
Mysql模拟事物的隔离级别【脏读、不可重复读、幻读】
|
SQL 存储 安全
MySQL的事务——事物隔离级别
MySQL的事务——事物隔离级别
172 0
MySQL的事务——事物隔离级别
|
关系型数据库 MySQL 测试技术
软件测试mysql面试题:事物的四大特性(ACID)介绍一下?
软件测试mysql面试题:事物的四大特性(ACID)介绍一下?
125 0
|
关系型数据库 MySQL
【MySQL】服务器异常停止的事物会如何应对
【MySQL】服务器异常停止的事物会如何应对
402 0
【MySQL】服务器异常停止的事物会如何应对
|
SQL 关系型数据库 MySQL
【MySQL】事物回滚理解
【MySQL】事物回滚理解
190 0
【MySQL】事物回滚理解
|
SQL 安全 关系型数据库
【MySQL】事物隔离级别
【MySQL】事物隔离级别
132 0
【MySQL】事物隔离级别
|
存储 缓存 安全
【MySQL】事物日志
【MySQL】事物日志
135 0
【MySQL】事物日志
|
SQL 存储 关系型数据库
Mysql事物锁等待超时 Lock wait timeout exceeded; try restarting transaction
Mysql事物锁等待超时 Lock wait timeout exceeded; try restarting transaction
741 0
|
SQL Oracle 关系型数据库
MySQL|MySQL事物以及隔离级别
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如开单,需要添加给订单表增加记录,还需要增加订单的各种相关明细,操作复杂度高,这些操作语句需要构成一个事务。在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
3046 0
|
MySQL 关系型数据库 数据库
mysql事物隔离
项目问题 最近工作内容需要向一张表里面写入数据,有两个实现方法,每种方法会运行得到一份结果,两个结果的key会有大部分重复,后面跟的value会有不同。表格中只允许两个结果中其中的一个key存在,二者选其一,只能更新替代。
1188 0