免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1946 | 回复: 2
打印 上一主题 下一主题

Mysql 一致性读与幻读理解求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-02 13:35 |只看该作者 |倒序浏览
测试如下
1、基本信息

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.6.22, for Win32 (x86)

Connection id:          3
Current database:       army
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.6.22-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    gbk
Conn.  characterset:    gbk
TCP port:               3306
Uptime:                 2 hours 14 min 16 sec

Threads: 1  Questions: 35  Slow queries: 0  Opens: 72  Flush tables: 1  Open tab
les: 65  Queries per second avg: 0.004
--------------

建表及准备数据

mysql>

session1

CREATE TABLE `auto` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;


mysql> desc auto;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> insert into auto (name) values ('A');
Query OK, 1 row affected (0.00 sec)

mysql>  insert into auto (name) values ('B');
Query OK, 1 row affected (0.00 sec)

mysql> insert into auto (name) values ('C');
Query OK, 1 row affected (0.00 sec)

mysql> select * from auto;
+----+------+
| id | name |
+----+------+
|  2 | A    |
|  3 | B    |
|  4 | C    |
+----+------+
3 rows in set (0.00 sec)

mysql> select * from auto;
+----+------+
| id | name |
+----+------+
|  2 | A    |
|  3 | B    |
|  4 | C    |
+----+------+
3 rows in set (0.00 sec)


mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

mysql> select  @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ       |
+-----------------------+
1 row in set (0.00 sec)


mysql> set autocommit=0
    -> ;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

开始测试 先查询数据
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from auto;
+----+------+
| id | name |
+----+------+
|  2 | A    |
|  3 | B    |
|  4 | C    |
+----+------+
3 rows in set (0.00 sec)



session 2  insert 数据

mysql> set autocommit=0
    ->
    -> ;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

mysql> select  @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ       |
+-----------------------+
1 row in set (0.00 sec)


mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)


mysql> select * from auto;
+----+------+
| id | name |
+----+------+
|  2 | A    |
|  3 | B    |
|  4 | C    |
+----+------+
3 rows in set (0.00 sec)
mysql> insert into auto (name) values ('D');
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from auto;
+----+------+
| id | name |
+----+------+
|  2 | A    |
|  3 | B    |
|  4 | C    |
|  5 | D    |
+----+------+
4 rows in set (0.00 sec)



session 1

查询
mysql> select * from auto;
+----+------+
| id | name |
+----+------+
|  2 | A    |
|  3 | B    |
|  4 | C    |
+----+------+
3 rows in set (0.00 sec)

--REPEATABLE-READ  在事务内保证了重复读

mysql> select * from auto for update;
+----+------+
| id | name |
+----+------+
|  2 | A    |
|  3 | B    |
|  4 | C    |
|  5 | D    |
+----+------+
4 rows in set (0.00 sec)

--出现幻读


求解释 select * from auto 与 select * from auto for update 结果不一致的原因



论坛徽章:
0
2 [报告]
发表于 2015-04-02 18:47 |只看该作者
支持一下!

求职 : Linux运维
论坛徽章:
203
拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之约旦
日期:2015-04-05 20:08:292015年亚洲杯之澳大利亚
日期:2015-04-09 09:25:552015年亚洲杯之约旦
日期:2015-04-10 17:34:102015年亚洲杯之巴勒斯坦
日期:2015-04-10 17:35:342015年亚洲杯之日本
日期:2015-04-16 16:28:552015年亚洲杯纪念徽章
日期:2015-04-27 23:29:17操作系统版块每日发帖之星
日期:2015-06-06 22:20:00操作系统版块每日发帖之星
日期:2015-06-09 22:20:00
3 [报告]
发表于 2015-04-05 20:13 |只看该作者
请使用序列化(Serializable) 隔离级别
http://www.it165.net/database/html/201310/4667.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP