MySQL 中事务详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中提供的孤立级别有以下四种:

1)SERIALIZABLE(序列化)  

  //以序列的形式处理事务,只有事务提交后,用户才能看到,但是该级别的孤立会影响mysql的性能,因为需要占用大量的资源,以保证使大量事务在任意时间不被用户看到。

(2)REPEATABLE  READ(可重读)

  // 相比序列化该级别在应用的安全性上做了部分妥协。

3)READ COMMITTED(提交后读)

 // 提交后读的安全性比可重读还要低。在这一级的事务,用户可以看到其他事务添加的新记录,在事务处理时,如果存在其他用户同时对事务的相应表进行修改,那么同一事务在不同时间使用select 查询得到的结果集可能不同。

(4)READ  UNCOMMITTED(未提交读)

//安全性相比提交后读就更低,同时该孤立及也是事务之间最小的间隔(孤立程度),该孤立级容易产生虚幻读操作。其他用户可以在该孤立级上看到未提交的事务。

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

、脏读、不可重复读、幻读概念

  • 脏读当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

  • 不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

  • 幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样

(4)、脏读、不可重复读、幻读区别


技术分享


脏读是一个事务读到另一个事务未提交的更新数据,不可重复读是一个事务读到另一个事务已提交的更新数据,幻读是一个事务读到另一个事务已提交的新插入的数据


本文出自 “梦想照进现实” 博客,请务必保留此出处http://lookingdream.blog.51cto.com/5177800/1905789

以上是关于MySQL 中事务详解的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 中事务以及事务隔离级别的详解

MySQL事务隔离级别锁相关的详解

MySQL事务详解

MySQL的事务详解

Net Core中数据库事务隔离详解——以Dapper和Mysql为例

MySQL进阶MySQL事务详解