设为首页 收藏本站
查看: 1152|回复: 0

[经验分享] MySQL 中事务详解

[复制链接]

尚未签到

发表于 2018-10-10 09:32:51 | 显示全部楼层 |阅读模式
  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中,实现了这四种隔离级别,分别有可能产生问题如下所示:
DSC0000.jpg

  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 ;  //释放了所有加锁表的锁。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-619798-1-1.html 上篇帖子: 如何在mysql安全模式下更改mysql的root密码 下篇帖子: MySQL抓包工具:MySQL Sniffer-DBA,架构师
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表