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、在多用户的时候使用孤立性级别是很重要的,这样可以保证这些事务互不影响,保证数据库性能不受到影响。
2、mysql中提供的孤立级别有以下四种:
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:
脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:
3、事务孤立级的查看和修改:
查看:select @@tx_isolation;
修改:set global transaction isolation level 设置的孤立级别;
七、伪事务(锁定)
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 ; //释放了所有加锁表的锁。
转载于:https://blog.51cto.com/lookingdream/1905789
MySQL 中事务详解相关推荐
- Mysql数据库事务详解
80年代中国人结婚四大件:手表.自行车.缝纫机.收音机(三转一响).要把事务娶回家需要四大件,所以事务很刻薄(ACID),四大件清单:原子性(Atom).一致性(Consistent).隔离性(Iso ...
- MySQL中innodb_page_cleaners详解
innodb_page_cleaners是MySQL中的刷脏线程个数,它的值等于innodb_buffer_pool_instances的值,如果innodb_page_cleaners的值大于inn ...
- MySQL中EXPLAIN详解
EXPLAIN作为MySQL的性能分析神器,读懂其结果是很有必要的,然而我在各种搜索引擎上竟然找不到特别完整的解读.都是只有重点,没有细节(例如type的取值不全.Extra缺乏完整的介绍等). my ...
- MySQL中information_schema详解
一.information_schema简介 在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库.其中保存着关于MySQL服务器所维护的所有其他数据库的信息 ...
- MySql中 delimiter 详解
其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了.默认情况下,delimiter是分号;.在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令 ...
- MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)
原文地址:https://blog.csdn.net/mysteryhaohao/article/details/51669741
- mysql 事物的持久性是指_详解MySQL中事务的持久性实现原理
前言 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什 ...
- mysql dba系统学习-数据库事务详解
mysql dba系统学习-数据库事务详解 上个星期去面试数据库管理员的工作,笔试通过之后就是直接的面试,他问了我一个问题,叫我介绍哈数据库的事务的看法和理解,但是不知所错的没有章法的乱答一气,唉唉, ...
- JAVA中Explain注解用法,mysql之explain详解(分析索引最佳使用)
mysql之explain详解(分析索引最佳使用) mysql explain用于分析sql 语句的执行及数据库索引的使用.本文将致力于帮助大家充分理解explain所返回的各项参数,从而使大家快速掌 ...
最新文章
- cpri带宽不足的解决方法_u盘容量不足怎么办 u盘容量不足解决方法【介绍】
- 自己编写的仿京东移动端的省市联动选择JQuery插件
- Codeforces Round #207 (Div. 1) B. Xenia and Hamming(gcd的运用)
- PIC单片机学习-中断
- Tomcat乱码解决方法
- 投简历 找工作 App
- kvm创建快照、查看快照、恢复快照、删除快照
- 用VS编译出不依赖VC运行库的可独立运行的程序
- 闭合曲线 网格坐标 matlab,MATLAB曲线绘制
- 第一次在csdn写博客!
- 直接拿来用!最火的前端开源项目
- Android 读取Txt文件内容
- 【附源码】计算机毕业设计SSM实验室预约管理系统
- uniapp实现生成海报功能
- opencv 去除背景
- python世界人口地图
- 2020年司钻(井下)考试题库及司钻(井下)考试APP
- latex 输入上极限和下极限
- 转行游戏公司却无从下手,游戏美术设计这个岗位再不了解就晚了!
- Oracle 分析函数over,列转行函数pivot理解及综合运用(报表中的小计和合计)
热门文章
- Flutter入门:Image组件
- sqrt开平方算法解析
- LOD优化策略-通篇
- Hadoop/Spark相关面试问题总结
- yii框架phpexcel
- [Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能
- 【云计算】使用privilege权限对Docker内核参数进行定制
- 使用MVC4,Ninject,EF,Moq,构建一个真实的应用电子商务SportsStore(一)
- POJ-2976 Dropping tests 01分数规划
- 每天学习flash一点(3) flash外部读取xml