mysql read commited 和 REPEATABLE read 原因

read commited 和 REPEATABLE read

关于一致性读的问题。 参考 mysql 技术内幕--innodb 存储引擎

session 1

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t2;

+------+

| id   |

+------+

|    1 |

+------+

1 row in set (0.00 sec)

同时到session2:

mysql>

mysql>

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t2;

+------+

| id   |

+------+

|    1 |

+------+

1 row in set (0.00 sec)

mysql> update t2 set id=2;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0

mysql>

mysql> select * from t2;

+------+

| id   |

+------+

|    2 |

+------+

1 row in set (0.00 sec)

mysql> commit;

Query OK, 0 rows affected (0.01 sec)

再回到session1:

如果是

mysql>  select @@tx_isolation;

+----------------+

| @@tx_isolation |

+----------------+

| READ-COMMITTED |

+----------------+

1 row in set (0.00 sec)

mysql> select * from t2;

+------+

| id   |

+------+

|    2 |

+------+

1 row in set (0.00 sec)

在session1 的同一个事物中,两次查询t2,会看到不通的结果,

如果是:

mysql> select @@tx_isolation;

+-----------------+

| @@tx_isolation  |

+-----------------+

| REPEATABLE-READ |

+-----------------+

1 row in set (0.00 sec)

在session 1 中,看到

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t2;

+------+

| id   |

+------+

|    2 |

+------+

1 row in set (0.00 sec)

mysql> select * from t2;

+------+

| id   |

+------+

|    2 |

+------+

1 row in set (0.00 sec)

是同一个结果。

这是由于mysql的一致性非锁定读 造成的。

如果读取的行正在备其他事物执行update或delete操作,这时读取操作不会因此去等待行上锁

的释放,innodb回去读一个快照数据。因为不需要等待访问的行上x锁的释放,所以称之为非锁定读。

快照数据是指该行 的之前版本的数据(可能有多个版本)。是通过undo断来实现的,undo是用

来在事物中回滚数据,因此快照数据没有额外开销。

在REPEATABLE read  下,快照读总是读取事物开始时的行版本数据;而在read commited下,

是读取最新一份快照,所以一个查询会看到不通的结果。

时间: 2024-12-20 19:12:41

mysql read commited 和 REPEATABLE read 原因的相关文章

Mysql无法创建外键的原因

MySQL无法创建外键的原因 1.  两个字段的类型或者大小不严格匹配.例如,如果一个是int(10),那么外键也必须设置成int(10),而不是int(11),也不能是tinyint.另外,你还必须确定两个字段是否一个为 signed,而另一个又是unsigned(即:无符号),这两字段必须严格地一致匹配,更多关于signed和unsigned的信息,请参阅:http://www.verysimple.com/blog/?p=57 2. 试图设置外键的字段没有建立起索引,或者不是一个prima

MySql事务无法回滚的原因

使用MySQL时,如果发现事务无法回滚,但Hibernate.Spring.JDBC等配置又没有明显问题时,不要苦恼,先看看MySQL创建的表有没有问题,即表的类型. InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能. MyIASM是I

MySQL出现同步延迟有哪些原因?如何解决?

企业面试题042:MySQL出现同步延迟有哪些原因?如何解决? 1.从库太多导致复制延迟 优化:建议从库数量3-5个为宜 2.从库硬件比主库硬件差 优化:提升硬件性能 3.慢SQL语句过多 优化:SQL语句执行时间太长,需要优化SQL语句 4.主从复制的设计问题 优化:主从复制单线程,可以通过多线程IO方案解决:另外MySQL5.6.3支持多线程IO复制. 5.主从库之间的网络延迟 优化:尽量链路短,提升端口带宽 6.主库读写压力大 优化:前端加buffer和缓存.主从延迟不同步: 不管有多延迟

【MySQL】Got fatal error 1236原因和解决方法

一 前言  MySQL 的主从复制作为一项高可用特性,用于将主库的数据同步到从库,在维护主从复制数据库集群的时候,作为专职的MySQL DBA,笔者相信大多数人都会遇到"Got fatal error 1236 from master when reading data from binary log" 这类的报错/报警.本文整理了常见的几种 error 1236 报错,并给出相应的解决方法,有所不足之处,当然也希望各位读者朋友指正. 二 常见的error 1236 报错2.1 log

MySQL连接缓慢,打开缓慢原因

问题状况:最近由于服务器变换了网段,导致IP地址变换,变化后使用MySQL客户端连接MySQL服务器和在客户端中打开表的速度非常慢(无论表的大小),甚至连接超时,但是直接登录到服务器在本地连接MySQL,速度则正常. 问题原因:MySQL数据库收到一个网络连接后,首先拿到对方的IP地址,然后对这个IP地址进行反向DNS解析从而得到这个IP地址对应的主机名.用主机名在权限系统里面进行权限判断.反向DNS解析是耗费时间的,有可能让用户感觉起来很慢.甚至有的时候,反向解析出来的主机名并没有指向这个IP

转!!!Mysql无法创建外键的原因

在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个是int(10),那么外键也必须设置成int(10),而不是int(11),也不能是tinyint.另外,你还必须确定两个字段是否一个为 signed,而另一个又是unsigned(即:无符号),这两字段必须严格地一致匹配,更多关于signed和unsigned的信息,请参阅:http://www.

(转)mysql 无法设置外键的原因总结

在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个是int(10),那么外键也必须设置成int(10),而不是int(11),也不能是tinyint.另外,你还必须确定两个字段是否一个为 signed,而另一个又是unsigned(即:无符号),这两字段必须严格地一致匹配,更多关于signed和unsigned的信息,请参阅:http://www.

mac 修改mysql 密码, navicat 连接失败原因

1.cd /usr/local/mysql/bin/?2.sudo su输入之后会要求输入你的计算机密码,输入的时候是什么都不显示的,输完后回车 3. ./mysqld_safe --skip-grant-tables &这一步的作用是跨过权限验证? 4../mysql -u root 用另一窗口以root身份登录,因为第三步的原因不需要密码了. 5. update user set authentication_string='root123' where User='root';? Navi

Mysql学习总结(19)——Mysql无法创建外键的原因

在MySQL中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个是int(10),那么外键也必须设置成int(10),而不是int(11),也不能是tinyint.另外,你还必须确定两个字段是否一个为 signed,而另一个又是unsigned(即:无符号),这两字段必须严格地一致匹配,更多关于signed和unsigned的信息,请参阅:http://www.