MySQL 中事务、事务隔离级别详解
一、事务的概念
1、事务的概念
2、在mysql中哪些存储引擎(表类型)支持事务哪些不支持
3、事务的四个属性
4、mysql事务的创建与存在周期
5、mysql行为
6、事务的隔离性和性能
7、mysql的伪事务
事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。
二、MySQL 中的存储引擎以及支持事务,和不支持事务的存储引擎
1、存储引擎的概念:在mysql中的数据用各种不同的技术存储在文件(或内存)中。
这些技术中的每一种技术都使用不同的存储机制,索引 技巧,并且最终提供广泛的不同的功能和能力。可以通过选择不同的技术,可以获得额外的速度或功能,从而改善应用的整体功能。
2、这些不同的技术以及配套的相关功能在mysql中被称为存储引擎(也称为表类型)。
3、通过show engines;来查看mysql支持的存储引擎。
4、 在mysql中用的最多的存储引擎有:innodb,bdb,myisam ,memory 等。其中innodb和bdb支持事务而myisam等不支持事务。
三、事务的四个属性
1、原子性:事务是由一个或一组相互关联的SQL语句组成,这些语句被认为是一个不可分割的单元,要么都成功要么全回滚。
2、一致性:对于数据库的修改是一致的,即多个用户查的的数据是一样的。一致性主要由mysql的日志机制处理,他记录数据的变化,为事务恢复提供跟踪记录。
3、隔离性:每个事务都有自己的空间,和其他发生在系统中的事务隔离开来,而且事务的结果只在他完全被执行时才能看到
4、持久性:但提交了这个事务之后对数据的修改更新就是永久的。当一个事务完成,数据库的日志已经被更新时,持久性即可发挥其特有的 功效,在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 、 beginwork
insert into stu1 values('', ); //进行相关的操作
commit //提交事物
rollback //撤销事务(事务回滚)
五:mysql行为
1、我们在使用mysql是如果关闭之后,打开在查询的话就会发现,哪些数据已经保存了,但是我们知道,在这过程中没有进行显示或隐式提交,问什么会这样那?因为我们在mysql中设置了自动提交,但我们也可以改为手动提交。
2、 set autocommit =0; //关闭自动提交
3、 set autocommit =1; //开启自动提交
六、事务的隔离性
现在重点来说明下事务的隔离性,当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,下面看看四种隔离界别
1、READ UNCOMMITTED(未提交读/脏读)
(1)、该隔离级别的事务,在数据修改过程中,即使没有提交,其他事务对于这些数据也是可读的。事务可读到未提交的数据也叫脏读(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、对于不支持事务的存储引擎MYISAM类型数据表,当用户插入,修改,删除时,这些操作都会立即保存到磁盘中,当多用户同时操作某个表时,可以使用表锁定来避免同一时间有多个用户对数据库中指定表进行操作,这样可以避免在用户操作数据表过程中受到干扰。
只有在用户释放表的操作锁定后,其他用户才可以访问这些修改的数据表。
这里的锁和java多线程中锁的作用一样,个人觉的可以这样理解。
3、对指定表进行锁操作的过程:
(1)lock table table-name lock type ; //locktype 有read 和write 两种
对多个表进行加锁:
lock table table-name1 lock type, table -name2 lock type ,table -name3 lock type;
(2)在指定的表中进行相应的操作
(3)当用户完成对锁定数据表的操作后,进行解锁。
unlock tables ; //释放了所有加锁表的锁。
MySQL 中事务、事务隔离级别详解相关推荐
- MySQL事务及隔离级别详解
MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...
- 数据库事务的四大特性以及事务的隔离级别详解
作者 : fjdingsd 来源 : 博客园 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ ...
- 数据库并发机制和事务的隔离级别详解
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/64444896冷血之心的博客) 本文将从以下4个方面来展开: (1) ...
- SQL Server-聚焦事务、隔离级别详解(二十九)
前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...
- SQL Server事务隔离级别详解
SQL Server事务隔离级别详解 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用 ...
- android json mysql_Android通过json向MySQL中读写数据的方法详解【读取篇】
本文实例讲述了Android通过json向MySQL中读取数据的方法.分享给大家供大家参考,具体如下: 首先 要定义几个解析json的方法parseJsonMulti,代码如下: private vo ...
- MySQL中ESCAPE关键字的用法详解
MySQL中ESCAPE关键字的用法详解 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 2. escape验证 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 ...
- MySQL 四种事务隔离级别详解及对比--转
http://www.jb51.net/article/100183.htm 接的隔离级别.它的语法如下: ? 1 SET [SESSION | GLOBAL] TRANSACTION ISOLATI ...
- 5、MySQL事务隔离级别详解
事务的隔离性就是指当多个事务同时运行时,各事务之间相互隔离,不可互相干扰.如果事务没有隔离性,就容易出现脏读.不可重复读和幻读等情况. 为了保证并发时操作数据的正确性,数据库都会有事务隔离级别的概念. ...
- mysql事务隔离级别详解_高性能MySQL-详解事务与隔离级别
本文主要包括一下内容: (1) 事务的概念与ACID (2)事务的隔离级别 (3)MySQL中的事务 1. 事务与ACID 理解事务是其它高级概念的基础.事务:事务就是一组原子性的SQL查询,或则说是 ...
最新文章
- Microsoft Exchange Server 2010测试四成员DAG
- Linux输入不同颜色字体
- QT:常用函数详解--常用操作记录(个人笔记)
- 分布式事务常见解决方案-关于状态机
- Python-学生信息管理系统.exe(代码)
- P5072-[Ynoi2015]盼君勿忘【莫队,根号分治】
- flutter tab选项卡appbar中的选项卡
- NamingException
- SQL联合主键 查重
- Android pid uid
- Nginx中的break和last
- Java设计模式之——代理设计模式
- 农村淘宝平台农资平台服务费一览
- 详解ASR语音转写场景下的应用
- 怎样在Word中添加批注?分享干货!word如何加入批注?
- 用VB实现的QQ自动登录器
- DataV-数据-api方式
- 砥砺前行,匠心致远|袋鼠云联合创始人、易知微CEO宁海元荣获“数字工匠 ”
- 多人配音怎么做的?这两个多人配音方法分享给你
- css 如何选择同一个class下的第一个div?
热门文章
- ubuntu16.04安装evo
- BundleFusion那些事儿
- 工业定焦镜头的选型公式
- 对永磁无刷电机的调速过程
- ANSYS——“There is at least 1 small equation solver pivot term”问题的解决办法
- 基于HALCON的模板匹配方法总结
- 我的世界1.7.10java32位_我的世界1.7.10中文版
- python逐行写入csv_python将列表按行写入csv
- linux cpu使用率1200%,linux下用top命令查看cpu利用率超过100%
- JAVA基础学习之路(十一)引用传递