在MySQL中设置事务隔离级别有2种方法:

1 在my.cnf中设置,在mysqld选项中如下设置

[mysqld]

transaction-isolation = READ-COMMITTED

2 在mysql窗口用set命令重置

  1. mysql> set global tx_isolation='REPEATABLE-READ';
  2. Query OK, 0 rows affected (0.01 sec)
  3. mysql>

查询当前的会话事务级别,可以使用:

  1. mysql> select @@tx_isolation;
  2. +----------------+
  3. | @@tx_isolation |
  4. +----------------+
  5. | READ-COMMITTED |
  6. +----------------+
  7. 1 row in set (0.00 sec)
  8. mysql>

查询全局的事务隔离级别,可以使用

  1. mysql> select @@global.tx_isolation;
  2. +-----------------------+
  3. | @@global.tx_isolation |
  4. +-----------------------+
  5. | READ-COMMITTED        |
  6. +-----------------------+
  7. 1 row in set (0.00 sec)
  8. mysql>

在Serializable模式下。

      1. mysql> system cat /usr/local/mysql56m2/my.cnf |grep  transaction-isolation
      2. transaction-isolation = READ-COMMITTED
      3. mysql>

复制二进制与隔离级别的关系

在SERIALIZABLE模式下,Innodb存储引擎会对每个select语句自动加Lock in sharedmode,给每一个读操作加共享锁。因此在这个隔离级别下,读占用锁了,一致性的非锁定读不再予以支持。因为Innodb存储引擎在 repeatable read 模式下就已经达到了3度的隔离,所以一般不在本地事务中使用serializable隔离级别,serializable的事务隔离级别主要用于 innodb存储引擎的分布式事务。

在Read committed的隔离模式下,除了唯一性约束检查以及外键约束检查需要Gap lock,innodb存储引擎不会使用gap lock的锁算法。不过使用read committed隔离级别需要注意一些问题,mysql5.1中,Read committed的事务隔离级别默认只能在replication的二进制为row格式下,如果二进制默认在statement模式下,则会报如下错 误:

  1. mysql> select @@version;
  2. +-------------+
  3. | @@version   |
  4. +-------------+
  5. | 5.5.25a-log |
  6. +-------------+
  7. 1 row in set (0.00 sec)
  8. mysql>
  9. mysql> select @@binlog_format;
  10. +-----------------+
  11. | @@binlog_format |
  12. +-----------------+
  13. | STATEMENT       |
  14. +-----------------+
  15. 1 row in set (0.00 sec)
  16. mysql> select @@tx_isolation;
  17. +-----------------+
  18. | @@tx_isolation  |
  19. +-----------------+
  20. | REPEATABLE-READ |
  21. +-----------------+
  22. 1 row in set (0.00 sec)
  23. mysql> set tx_isolation='READ-COMMITTED';
  24. Query OK, 0 rows affected (0.00 sec)
  25. mysql> use test;
  26. Database changed
  27. mysql> create table a (b int, primary key (b)) engine=innodb;
  28. ERROR 1050 (42S01): Table 'a' already exists
  29. mysql> select @@tx_isolation;
  30. +----------------+
  31. | @@tx_isolation |
  32. +----------------+
  33. | READ-COMMITTED |
  34. +----------------+
  35. 1 row in set (0.00 sec)
  36. mysql> begin
  37. -> ;
  38. Query OK, 0 rows affected (0.00 sec)
  39. mysql> insert into a select 100000;
  40. ERROR 1665 (HY000): Cannotexecute statement: impossible to write to binary log since BINLOG_FORMAT =STATEMENT and at least one table uses a storage engine limited to row-basedlogging. InnoDB is limited to row-logging when transaction isolation level isREAD COMMITTED or READ UNCOMMITTED.

ERROR 1665 (HY000):
Cannotexecute statement: impossible to write to binary log since
BINLOG_FORMAT =STATEMENT and at least one table uses a storage engine
limited to row-basedlogging. InnoDB is limited to
row-logging when transaction isolation level isREAD COMMITTED or READ
UNCOMMITTED.

[Note]:在mysql5.1以及mysql5.6模式下实验过都是如此。也许可以知道通过将innodb_locks_unsafe_for_binlog设置为1,来可以使binlog日志在statement下使用readcommitted的事务隔离级别:

  1. mysql> select @@innodb_locks_unsafe_for_binlog;
  2. +----------------------------------+
  3. | @@innodb_locks_unsafe_for_binlog |
  4. +----------------------------------+
  5. |                               0 |
  6. +----------------------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> set global innodb_locks_unsafe_for_binlog=1;
  9. ERROR 1238 (HY000): Variable 'innodb_locks_unsafe_for_binlog' is a readonly variable
  10. mysql>

此参数是只读模式,需要修改my.cnf重新启动才行。

在my.cnf里面的[mysqld]添加

[mysqld]

innodb_locks_unsafe_for_binlog = 1

然后重启,然后去check模仿一个事务操作,如下所示:

    1. mysql> select @@innodb_locks_unsafe_for_binlog;
    2. +----------------------------------+
    3. | @@innodb_locks_unsafe_for_binlog |
    4. +----------------------------------+
    5. |                               1 |
    6. +----------------------------------+
    7. 1 row in set (0.00 sec)
    8. mysql>
    9. mysql> use test;
    10. Reading table information for completion of table and column names
    11. You can turn off this feature to get a quicker startup with -A
    12. Database changed
    13. mysql> select @@tx_isolation;
    14. +----------------+
    15. | @@tx_isolation |
    16. +----------------+
    17. | READ-COMMITTED |
    18. +----------------+
    19. 1 row in set (0.00 sec)
    20. mysql> begin;
    21. Query OK, 0 rows affected (0.00 sec)
    22. mysql> insert into t select 15;
    23. Query OK, 1 row affected (0.00 sec)
    24. Records: 1  Duplicates: 0  Warnings: 0
    25. mysql> commit;
    26. Query OK, 0 rows affected (0.00 sec)
    27. mysql> select * from t;
    28. +--------+
    29. | id     |
    30. +--------+
    31. |      1 |
    32. |     12 |
    33. |     15 |
    34. |  11111 |
    35. | 111110 |
    36. +--------+
    37. 5 rows in set (0.00 sec)

在MySQL中设置事务隔离级别有2种方法:的更多相关文章

  1. mysql中不同事务隔离级别下数据的显示效果--转载

    事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...

  2. 浅谈mysql中不同事务隔离级别下数据的显示效果

    事务的概念 事 务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那 ...

  3. mysql中的事务隔离级别

    事务是逻辑上的一组操作,要么都执行,要么都不执行. 事务最经典的.经常被拿出来说的例子就是转账了.假如小花要给小白转账1000元,这个转账会涉及到两个关键操作就是:将小花的余额-1000,将小白的余额 ...

  4. day18 8.jdbc中设置事务隔离级别

    设置数据库事务隔离级别特殊需求才有,后面很少用.因为数据库本身是事务隔离级别的,mysql的事务隔离级别是Repeatable read,可以解决脏读和不可重复读.不用设置,人家数据库是有事务隔离级别 ...

  5. 重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系

    重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系 Innodb中的事务隔离级别和锁的关系 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁 ...

  6. 事务,Oracle,MySQL及Spring事务隔离级别

    一.什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二.事务特性(4种): 原子性 (atomicity):强调事务的不可分割:一致性 (consiste ...

  7. MySQL事物(一)事务隔离级别和事物并发冲突

    数据库的操作通常为写和读,就是所说的CRUD:增加(Create).读取(Read).更新(Update)和删除(Delete).事务就是一件完整要做的事情.事务是恢复和并发控制的基本单位.事务必须始 ...

  8. 深入理解Mysql索与事务隔离级别

    1. 概述 1.1 定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并 ...

  9. Innodb中的事务隔离级别和锁的关系(转载)

    nodb中的事务隔离级别和锁的关系 原文:https://tech.meituan.com/innodb-lock.html ameng ·2014-08-20 15:50 前言: 我们都知道事务的几 ...

随机推荐

  1. JS以指定格式获取当前日期

    //获取当前时间,格式YYYY-MM-DD function getNowFormatDate() { var date = new Date(); var seperator1 = "-& ...

  2. HISAT2的运用

    功能: 用于有参考基因组存在的比对工具(适用于whole-genome, transcriptome, and exome sequencing data) 用法: hisat2-build [opt ...

  3. Hadoop程序基础模板

    分布式编程相对复杂,而Hadoop本身蒙上大数据.云计算等各种面纱,让很多初学者望而却步.可事实上,Hadoop是一个很易用的分布式编程框架,经过良好封装屏蔽了很多分布式环境下的复杂问题,因此,对普通 ...

  4. html5-entities.js消失问题

    今天用nuxt做项目时,启动npm run dev,项目正常启动, 可过一会儿再试图启动时却报错: * ./libhtml5-entities.js in ./~/html-entities/inde ...

  5. Django源码剖析

    一.Django底层剖析之一次请求到响应的整个流程 As we all know,所有的Web应用,其本质上其实就是一个socket服务端,而用户的浏览器就是一个socket客户端 #!/usr/bi ...

  6. hdu1010感想

    杭电这道题是用dfs走迷宫问题,一直wa是因为没有将走过的地方标记,所以如果遇到走迷宫的问题一定要将走过的地方标记,如下: &&nx<n&&ny>=& ...

  7. Qt使用QCustomPlot开发

    一.入门 1.下载源文件http://www.qcustomplot.com/: 2.把.cpp和.h放在工程目录下,并将cpp和h加入工程: 3.在.pro中:QT += printsupport: ...

  8. [Python]基于CNN的MNIST手写数字识别

    目录 一.背景介绍 1.1 卷积神经网络 1.2 深度学习框架 1.3 MNIST 数据集 二.方法和原理 2.1 部署网络模型 (1)权重初始化 (2)卷积和池化 (3)搭建卷积层1 (4)搭建卷积 ...

  9. 吴恩达深度学习笔记(九) —— FaceNet

    主要内容: 一.FaceNet人脸识别简介 二.使用神经网络对人脸进行编码 三.代价函数triple loss 四.人脸库 五.人脸认证与人脸识别 一.FaceNet简介 1.FaceNet是一个深层 ...

  10. Luogu-3966 [TJOI2013]单词

    这道题应该是后缀数组的套路题啊,把单词连接起来,中间用没有出现过且互不相同的字符来分隔开,求一下\(height\)数组. 对于一个单词来说,设单词长\(len\),所在的后缀为\(i\),如果某后缀 ...