1:创建一个实验表

mysql> use test;

mysql> CREATE TABLE t
-> (id int(11) NOT NULL DEFAULT 0,
-> num int(11) DEFAULT NULL,
-> PRIMARY KEY(id))
-> ENGINE=INNODB DEFAULT CHARSET=gbk;
Query OK, 0 rows affected (0.02 sec)

  

mysql> INSERT INTO t VALUES(1,100);

mysql> INSERT INTO t VALUES(2,200);
Session A Session B
mysql> BEGIN;  
mysql> SELECT * FROM t;
+----+------+
| id | num |
+----+------+
| 1 | 100 |
| 2 | 200 |
+----+------+
2 rows in set (0.00 sec)

  

 
 
mysql> USE test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql> INSERT INTO t VALUES(3,300);
Query OK, 1 row affected (0.01 sec)

  

mysql> SELECT * FROM t;
+----+------+
| id | num |
+----+------+
| 1 | 100 |
| 2 | 200 |
+----+------+
2 rows in set (0.00 sec)
 
mysql> UPDATE t SET num=1000 WHERE id=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

上述查看并没有id=3的列,这里居然成功了!

 
mysql> SELECT * FROM t;
+----+------+
| id | num |
+----+------+
| 1 | 100 |
| 2 | 200 |
| 3 | 1000 |
+----+------+
3 rows in set (0.00 sec)

  

 
从Session A整个过程看来,它试图更新一个不存在的记录(id=3),结果更新成功,并且之后这个记录可以访问。

为什么SessionA第二次检索仍然是2条记录呢?

    Innodb内部每个事务开始时,都会有一个事务id,同时事务对象中还有一个read_view变量,用于控制该事务可见的记录范围(MVCC)。

    对于每个访问到的记录行,会根据read_view的trx_id(事务id)与行记录的trx_id比较,判断记录是否逻辑上可见。

    Session B中插入的记录不可见,原因即为Session A先于session B,因此新插入的数据经过判断,不在可见范围内。对应的源码在row/row0sel.c [4040-4055].

  

Session A Session B
mysql> SELECT * FROM t;
+----+------+
| id | num |
+----+------+
| 1 | 100 |
| 2 | 200 |
| 3 | 1000 |
+----+------+
3 rows in set (0.00 sec)

  

 
 
mysql> INSERT INTO t VALUES(4,400);
Query OK, 1 row affected (0.01 sec)

  

mysql> SELECT * FROM t;
+----+------+
| id | num |
+----+------+
| 1 | 100 |
| 2 | 200 |
| 3 | 1000 |
+----+------+
3 rows in set (0.00 sec)

  

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

  

 
mysql> SELECT * FROM t;
+----+------+
| id | num |
+----+------+
| 1 | 100 |
| 2 | 200 |
| 3 | 1000 |
| 4 | 400 |
+----+------+
4 rows in set (0.00 sec)

提交之后正常可见

 

MySQL 多会话之间更新数据的小实例的更多相关文章

  1. Mysql与web之间的数据、查询等个问题

    Mysql与web之间的数据.查询等个问题 在自己写的一个jsp主页连接数据库出现的各种问题,写记下来与大家分享,共勉.最后附jdbc代码. ---DanlV Error 1---错误代码: java ...

  2. net下 Mysql Linq的使用, 更新数据,增加数据,删除数据

    net下访问mysql主要有2种方法: 1.字符串拼接访问 a.mysql官网下载并安装mysql-connector-net. b项目中引用mysql.data等 所有增删改查可以通过拼接sql语句 ...

  3. Hadoop Hive概念学习系列之HDFS、Hive、MySQL、Sqoop之间的数据导入导出(强烈建议去看)

    Hive总结(七)Hive四种数据导入方式 (强烈建议去看) Hive几种数据导出方式 https://www.iteblog.com/archives/955 (强烈建议去看) 把MySQL里的数据 ...

  4. 循序渐进VBA EXCEL数据操作小实例

    1 向指定单元格区域内写入数据 Sub example1() ) arr() = Array("A", "B", "C", "D& ...

  5. MYSQL存储过程:批量更新数据

    地区等级的信息储存在jsjh_district表. 要更新jsjh_goods_district表的district_level地区信息 DELIMITER $$ DROP PROCEDURE IF ...

  6. MYSQL存储过程:批量更新数据2(产品品牌)

    执行语句 DELIMITER $$ DROP PROCEDURE IF EXISTS jsjh_goods_property_value_update$$ CREATE PROCEDURE jsjh_ ...

  7. [转]MYSQL 与 Oracle 之间的数据类型转换

    原文地址:http://www.cnblogs.com/guyueyanzi/archive/2010/02/27/1674788.html Table 2-4 Default Data Type M ...

  8. Mysql与Oracle之间的数据类型转换

    MySQL Data Type Oracle Data Type BIGINT NUMBER(19, 0) BIT RAW BLOB BLOB, RAW CHAR CHAR DATE DATE DAT ...

  9. mysql通过拷贝文件实现数据快速迁移实例

    最近在做监控DB的迁移,由于数据量非常大,采用直接拷贝从机数据目录的方式,操作过程有几个注意事项,记录下来,以备后用: 操作步骤: 1.停掉从机的SQL线程,并将 innodb_max_dirty_p ...

随机推荐

  1. [C#搜片神器] 之P2P中DHT网络爬虫原理

    继续接着上一篇写:使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)[搜片神器] 昨天由于开源的时候没有注意运行环境,直接没有考虑下载BT种子文件时生成子文件夹,可能导致有的朋友运行 ...

  2. C++模板实例掌握

    前段时间重新学习C++,主要看C++编程思想和C++设计新思维.对模版的使用有了更进一层的了解,特总结如下: 下面列出了模版的常用情况:  << '\n';} //参考:http://ww ...

  3. memcache、memcached、groupcache的区别

    对PHP语言来说,PHP使用memcache有两个模块,分别叫memcache和memcached,他们的区别看下表: 参考:http://hi.baidu.com/tony_wd/item/605e ...

  4. bzoj3064 CPU监控

    今天终于写了一道正常的题 思路是这样的: 1.普通线段树add,set不变,并改为下放标记版本 2.past_addv 记录一个区间内可能的addv值的最大值 3.past_setv 记录一个区间被s ...

  5. 线程局部变量ThreadLocal的原理及使用范围_1

    线程局部变量ThreadLocal的原理及使用范围 使用原理 每个Thread中都有一个ThreadLocalMap成员, 该成员是ThreadLocal的内部类ThreadLocalMap类型.每使 ...

  6. Basic Sorting Algorithms

    *稳定指原本数列中相同的元素的相对前后位置在排序后不会被打乱 快速排序(n*lgn 不稳定):数组中随机选取一个数x(这里选择最后一个),将数组按比x大的和x小的分成两部分,再对剩余两部分重复这个算法 ...

  7. Code-first示例

    首先创建一个空数据库 在vs2013中添加数据库类,按提示操作一直下一步   添加完以后,数据库类的代码 namespace mvctest.Models { using System; using ...

  8. java开发eclipse常见问题(一)The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    最近刚开始用Eclipse开发,刚开始都是按教程一步一步的新建web工程也没出现什么问题. 今天选了一个新的workspace,建了个web工程发现最简单的jsp页面都报错:The superclas ...

  9. jquery ajax跨域的完美解决方法(jsonp方式)

    ajax跨域请求的问题,JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式,接下来为大家详细介绍下客户端JQuery.ajax的调用代码     今天在项目中需要做远程数据加载 ...

  10. [转]eoe社区cocos2d-x游戏引擎知识大汇总

    [eoeAndroid 社区]特意为大家汇总了cocos2d-x知识贴,分量十足,纯正干或.从基础教程到游戏应用的开发,我们不让知识流失,我们要做知识的搬运工还有加工 师.希望大家能够一起的学习,和大 ...