session mysql更新_MySQL 多会话之间更新数据的小实例

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)

提交之后正常可见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值