图片 8

MySQL中InnoDB存储引擎的事务隔离级别与事务处理

MySQL中InnoDB存储引擎的事务隔离级别与事务处理

一、基本介绍

当前在开发ERP系统,使用到的数据库为Mysql。下面介绍下如何开启事务,以及事务隔离的机制

 

事务就是一组dml语句,这些语句存在逻辑上的相关性,这一组dml语句要么全部成功,要么全部失败,是一个整体。ACID属性(原子性,一致性,隔离性,持久性);mysql提供一种机制,保证我们可以达到这样的效果。事务还规定了不同的客户端看到的数据是不相同的,
举例说明:

  1. 检查当前数据库使用的存储引擎。

1、事务进行中,不得用set transaction命令更改隔离级别。但可以用set
{global|session} transaction更改隔离级别。文档上说set
transaction可以改变当前会话的下一个事务的隔离级别,实际测试发现不起做用。 

图片 1

show engines;

2、用set [{global|session}]
tx_isolation={READ-COMMITTED|REPEATABLE-READ}改变事务隔离级别。 

图片 2

图片 3

 

说明:  

  1. 修改前my.ini中的文件如下:

3、read
committed隔离级别,二进制日志必须为row格式,或者不启用二进制日志。 

  默认情况下,MySQL是自动提交的;

图片 4

 

start transaction 或 begin 语句开始一项新的事务

  1. 修改my.ini的文件如下。

4、autocommit为OFF时,上一个事务结束(rollback或commit)后,立即开启一个新的事务。事务的快照点,为事务中的第一条SQL语句(SELECT,DML)执行的时间点。

commit 和 rollback 用来提交或回滚事务

     3.1 修改了默认的存储引擎

 

chainrelease子句分别用来定义在事务提交或者回滚之后的操作,chain会立即启动一个新事务,并且和刚才的事务具有相同的隔离级别,release则会断开和客户端的链接;语句
commit and chain; 提交后立即开始一个新的事务

     3.2 增加了mysql数据库的事务隔离级别,
如果不添加默认是REPEATABLE-READ.

5、autocommit为ON时,每一个SQL语句(SELECT,DML)结束后,立即开启一个新的事务。事务的快照点,为事务中的(唯一的)SQL语句(SELECT,DML)执行的时间点。 

set autocommit 可以修改当前链接的提交方式,如果设置了set
autocommit=0,则设置之后的所有事务都需要通过明确的命令进行提交或回滚

图片 5

 

默认情况下只对提交的事务记录到二进制的日志中。

 

6、start
transaction语句,立即开启一个新的事务。事务的快照点,为事务中的第一条SQL语句(SELECT,DML)执行的时间点。 

所有的DDL语句是不能回滚的,并且部分的DDL语句会造成隐式的提交。

4. 只需要重启mysql的服务即可。

 

   默认情况下,表锁和行锁都是自动获得的,不需要额外的命令。

    net stop mysql 

7、start
transaction语句后,未执行commit或rollback来结束一个事务,再次执行start
transaction语句,会隐式commit之前的事务,然后再开启一个新的事务。 

lock tables 表名 [read|write] ;
锁定当前线程的表,若表被其他线程锁定,则当前线程会等待;

    net start mysql

 

unlock tables 释放当前线程获得的任何锁定

    图片 6

1、事务进行中,不得用set transaction命令更改隔离级别。但可以用set
{global|session} transaction更…

在所锁表期间,用start
transaction命令开始一个新事务,会造成一个隐含的unlock tables被执行。

  1. 再次查询show engines,显示如下

二、如何在mysql控制台使用事务

图片 7

1、创建一张表

  1. 事务隔离机制的说明,以下引用自别人的文章

2、事务的基本使用


  开始一个事务

 

      start transaction;

  • 未提交读(READ
    UNCOMMITTED)。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)。
  • 提交读(READ
    COMMITTED)。本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)。如两个会话a和b,由于是read
    committed所以只有当事务提交后才能被别的事务可见,当a执行查询后b执行插入,b执行commit提交事务,这时a再次查询结果确实不一样的,a的两次查询同属于一个事务,即为不可重复读。
  • 可重复读(REPEATABLE
    READ)。在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。直到提交事务后再查询才可以看到其他事务在本事务执行期间锁进行的更改操作。在MySQL中InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC)解决了幻读的问题。
  • 串行化(SERIALIZABLE)。读操作会隐式获取共享锁,可以保证不同事务间的互斥。
  • SQL 事务隔离级别 

  做了一个保存点

 图片 8