Mysql中事务及事务隔离级别详解
大千世界,茫茫人海,相识就是一种缘分。若此篇文章对您有帮助,点个赞或点个关注呗!
一、事务的概念
事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个Mysql语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或者产生错误,整个单元将会回滚。所有受到影响的数据将返回到事务开始以前的状态;如果单元中的所有SQL语句均执行成功,则事务将顺利执行。
二、Mysql中的存储引擎以及支持事务
- 存储引擎的概念:在Mysql中的数据用各种不同的技术存储在文件(或内存)中。
- 通过show engines;查看Mysql支持的存储引擎。
- 在mysql中用的最多的存储引擎有:innodb,bdb,myisam ,memory 等。其中innodb和bdb支持事务而myisam等不支持事务。
三、事务的四个属性(ACID)
1. 原子性(Atomic)
事务内部的一系列操作不可再分,要么全部成功,要么全部失败。
2. 一致性(Consistent)
事务执行前后系统中数据的状态必须保持一致性。一致性主要由Mysql的日志机制处理,记录数据的变化,为事务恢复提供跟踪记录。
3. 隔离性(Isolation)
多个并发事务操作时,一个并发事务只能看到其他事务执行之前或执行之后的数据状态。不能查看其他事务执行过程中的数据状态。
4. 持久性(Durative)
事务一旦执行成功,那么对系统数据的影响是持久化的。当一个事务完成后,数据库的日志已经被更新时,持久性即可发挥其特有的功效。在mysql中,如果系统奔溃或数据存储介质被破坏,通过日志,系统能够恢复在重启前进行的最后一次成功更新,可以反应系统奔溃时处于执行过程的事务的变化。
四、事务创建及生存周期
对于支持事务的存储引擎,一个事务的周期:
1、在创建事务的过程中,用户需要创建一个innodb或bdb类型的数据表,其基本命令结构如下:
create table table_name (file defintions) type=innodb/bdb;
2、对表类型进行修改
alert table table-name type =innodb/bdb;
3、事务的整个过程
use databases; //使用某个数据库start transaction ; //开始事务 、这里也可以使用 begin 、 beginworkinsert into stu1 values('', ); //进行相关的操作commit //提交事物rollback //撤销事务(事务回滚)
五、设置mysql是否为手动提交
set autocommit = 0;//关闭自动提交
set autocommit = 1;//开启自动提交
六、事务的隔离性
现在重点来说明下事务的隔离性,当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,下面看看四种隔离界别
1、READ UNCOMMITTED(未提交读/脏读)
该隔离级别的事务,在数据修改过程中,即使没有提交,其他事务对于这些数据也是可读的。事务可读到未提交的数据也叫脏读(Dirty Read),由于脏读在实际应用中会导致很多问题,一般这类隔离级别应用很少。
2、READ COMMITTED(不可重复读/提交后读)
(1)、不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
(2)、(一般数据库默认事务级别)只有当前事务执行完,把数据提交之后,其他事务才可对这些数据进行读取。也叫不可重复读,因为其他事务执行2次查询可能前后会得到2个不同结果(事务执行前读一次,执行后读一次)。
3、REPEATABLE READ(可重读/幻读)
(1)、幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
(2)、(Mysql的默认隔离级别)解决了脏读的问题,该级别保证了在同一事务中,多次读取的结果是一致的。但仍旧无法解决幻读问题。幻读:事务A在读取一定范围内数据时,事务B有对该范围数据进行插入等更新操作,事务A再次读取该范围记录时,会产生幻读。
4、SERIALIZABLE(序列化/串行化)
(1)、在读取每一行数据的时候都对该行数据加锁,强制事务串行执行,在事务提交的时候会释放锁,这时其他事务才能获取相关数据的锁进行处理这样避免了幻读问题,隔离性达到了最高但是这种执行方式效率 低,锁竞争激烈容易出现超时问题。
只有在对数据一致性要求很强的时候和没有并发或并发量很小的时候使用!
5、事务隔离级别的查看和修改
查看:select @@tx_isolation;
修改:set global transaction isolation level 设置的隔离级别;
6、mysql中支持的四种隔离级别
(1)、Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
(2)、Repeatable read (可重复读):可避免脏读、不可重复读的发生。
(3)、Read committed (读已提交):可避免脏读的发生。
(4)、Read uncommitted (读未提交):最低级别,任何情况都无法保证。
六、伪事务(锁)
1、在Mysql中根据不同的需求,提供了很多存储引擎,但是有的存储引擎不支持事务,对于这种情况,可以使用表锁定来代替事务。
2、对于不支持事务的存储引擎,当用户插入、修改、删除时,这些操作都会立即保存到磁盘中,当多用户同时操作某个表时,可以使用表锁定来避免同一时间有多个用户对数据库中指定的表进行操作,这样可以避免在用户操作数据表过程中受到干扰。只有在用户释放锁后,其他用户才可以访问这些修改的数据表。
这里的锁合Java中的多线程中锁的作用一样。
3、对指定表进行锁操作的过程:
lock table table-name lock type ; //locktype 有read 和write 两种
对多个表加锁:
lock table table-name1 lock type, table -name2 lock type ,table -name3 lock type;
释放锁:
unlock tables ; //释放了所有加锁表的锁。
七、存储引擎介绍:
关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式。有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时却很差;而我们在实际开发过程中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数据,数据的处理上也会存在着差异,那么。对于MySQL来说,它提供了很多种类型的存储引擎,我们可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用MySQL强大的功能
类型 | MyIsam | InnoDB | Memory | Archive |
---|---|---|---|---|
存储限制 | 256TB | 64TB | 有 | - |
事务安全 | - | 支持 | - | - |
支持索引 | 支持 | 支持 | 支持 | - |
锁颗粒 | 表锁 | 行锁 | 表锁 | 行锁 |
数据压缩 | 支持 | - | - | - |
支持外键 | - | 支持 | - | - |
表锁 :付出代价小,不利于并行
行锁:付出代价大,有利于并行
共享锁 读锁
排他锁 写锁
Mysql中事务及事务隔离级别详解相关推荐
- MySQL事务及隔离级别详解
MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...
- SQL Server事务隔离级别详解
SQL Server事务隔离级别详解 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用 ...
- MySQL 四种事务隔离级别详解及对比--转
http://www.jb51.net/article/100183.htm 接的隔离级别.它的语法如下: ? 1 SET [SESSION | GLOBAL] TRANSACTION ISOLATI ...
- MySQL事务隔离级别详解
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted(读 ...
- 数据库事务转载基础二:MySQL事务隔离级别详解
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted(读 ...
- mysql服务器级别角色_服务器数据库系列 - MySQL事务隔离级别详解
作者:xm_king SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Un ...
- SQL Server-聚焦事务、隔离级别详解(二十九)
前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...
- mysql 事物隔离级别详解
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted ...
- SQL Server-聚焦SNAPSHOT基于行版本隔离级别详解(三十)
前言 上一篇SQL Server详细讲解了隔离级别,但是对基于行版本中的SNAPSHOT隔离级别仍未完全理解,本节再详细讲解下,若有疑义或不同见解请在评论中提出,一起探讨. SNAPSHOT行版本隔离 ...
- MySQL 中事务、事务隔离级别详解
一.事务的概念 1.事务的概念 2.在mysql中哪些存储引擎(表类型)支持事务哪些不支持 3.事务的四个属性 4.mysql事务的创建与存在周期 5.mysql行为 6.事务的隔离性和性能 7.my ...
最新文章
- SPOJ Substring Problem(Rabin Karp TLE)
- xtrabackup备份mysql_配置xtrabackup备份mysql数据库
- 计算机网络工程实验分析与体会_《软件工程》面向对象分析实验
- c语言二维数组参数传入,C语言二维数组、参数传递的理解
- dlut-KFQ概率上机2
- 存储过程中定义sql语句_学习SQL:用户定义的存储过程
- 洛谷——P2440 木材加工
- 【轻院热身赛】级数求和、进制转换、candy
- TableView的cell加载倒计时重用问题解决方案
- 基于php的学校固定资产管理系统
- jupyter连接失败
- Mac没声音解决办法记录
- 数据泵导入报错ORA-39125和LPX-00225
- java语言基础之关键字1(public、protested、private、static)
- Linux环境下使用阿里云盘
- 前后端分离的文件上传,上传zip或者rar压缩包(vue+springboot)。
- JVM运行参数之-X和-XX参数
- jodatime java8交互_Joda-time学习笔记
- 层次分析法 你真的懂了吗?(完更)
- android声音大小锁定,固定音量锁(锁定音量)app
热门文章
- ModuleNotFoundError: No module named ‘_bz2‘
- Win11的两个实用技巧系列之加载驱动失败怎么办、占用内存高的解决办法
- java 画图 graphics
- 都吃移动营销饭,四大门户有什么不同姿势?
- JS实现简单的网页新闻无缝滚动
- 笔记本利用网线和wifi同时连接办公网跟互联网
- ESP32 直接使用WIFI进行UDP通信, 将光敏电阻传感器数值, 显示在OLED上 - 米思齐/Arduino
- 信息化天灾人祸启示录(转)
- vrrp路由器三种状态_VRRP协议具体解释
- 午餐不知道吃什么?用 Python 爬美团App评论选餐!