美文网首页mysql
mysql 事务测试

mysql 事务测试

作者: 良人与我 | 来源:发表于2019-03-27 22:46 被阅读0次

数据库表 t_student 里的数据如下

mysql> select * from t_student;
+----+-----+-------+
| id | age | sname |
+----+-----+-------+
|  1 |  10 | river |
|  2 |  20 | fank
  |
|  3 |  30 | lucy  |
+----+-----+-------+
3 rows in set

打开两个console 测试隔离性。

1 隔离性测试

A 开启事物,对第一条数据进行修改

mysql> begin ;
Query OK, 0 rows affected
mysql> update t_student set age = 11 where id = 1;
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0

B 查看表数据

mysql> select * from t_student;
+----+-----+-------+
| id | age | sname |
+----+-----+-------+
|  1 |  10 | river |
|  2 |  20 | fank
  |
|  3 |  30 | lucy  |
+----+-----+-------+
3 rows in set

B 看不对 A 未提交事物的更改。

如果B 开启了事物查看到的也是相同的结果

mysql> begin;
Query OK, 0 rows affected

mysql> select * from t_student;
+----+-----+-------+
| id | age | sname |
+----+-----+-------+
|  1 |  10 | river |
|  2 |  20 | fank
  |
|  3 |  30 | lucy  |
+----+-----+-------+
3 rows in set

如果B对 第一条数据更改呢

update t_student set age = 11 where id = 1;

B 被阻塞主了。
如果A长时间不提交B就会报异常

mysql> update t_student set age = 12 where id = 1;
1205 - Lock wait timeout exceeded; try restarting transaction

但是此时B 还在自己的事务里必须提交后才能看到A的变化。
B的更新 有没有 被执行?
被执行了。mysql 自己 try restarting transaction

2 更新被锁住

A 按照条件更新(非主键)

mysql> begin;
Query OK, 0 rows affected

mysql> update t_student set sname = 'age11'  where age = 11;
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0

B 插入数据时候 被阻塞

mysql> INSERT INTO river.t_student (age, sname) VALUES(33, 'tom');
1205 - Lock wait timeout exceeded; try restarting transaction

update 也被阻塞了

mysql> update t_student set age = 44 where id = 3;
1205 - Lock wait timeout exceeded; try restarting transaction

这里的锁 锁住了整张表。

3 间隙锁测试

表里数据

mysql> select * from t_student;
+----+-----+-------+
| id | age | sname |
+----+-----+-------+
|  1 |  11 | age11 |
|  2 |  20 | fank
  |
|  3 |  30 | lucy  |
|  6 |  33 | tom   |
|  9 |  33 | tom   |
| 10 |  33 | tom   |
+----+-----+-------+
6 rows in set

A表更新数据

mysql> begin;
Query OK, 0 rows affected

mysql> update t_student set sname = 'river' where id > 6 and id < 10
;
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0

B 表插入数据 id 为 8 ,刚好在(6,10)范围内

mysql> INSERT INTO t_student (id,age, sname) VALUES(7,33, 'tom');

被锁住
如果不在 (6,10)的范围内呢

mysql> INSERT INTO t_student (id,age, sname) VALUES(20,36, 'tom');
Query OK, 1 row affected

没有被锁住。

相关文章

  • mysql 事务测试

    数据库表 t_student 里的数据如下 打开两个console 测试隔离性。 1 隔离性测试 A 开启事物,对...

  • mysql事务及锁使用测试

    mysql事务及锁使用测试mysql -h127.0.0.1 -P3306 -uroot -p123456use ...

  • MySQL锁简介

    备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊MySQL 事务 一.MySQL锁概述 数据库锁定...

  • 6、mysql事务测试

    6.1 文章目的 在mysql中创建数据,依据该数据,对mysql各个事务隔离级别进行实验。 6.2 打开mysq...

  • 事务嵌套会隐式触发commit

    mysql中事务嵌套会隐式触发commit 测试 注意:在第二个事务开始的时候其实就已经提交了事务。 autoco...

  • mysql事务隔离级别测试

    隔离性mysql提供了4种不同的隔离级别以支持多版本并发控制(MVCC)较低级别的隔离通常可以执行更高的并发,系统...

  • MySQL的四种事务隔离级别

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一、事务的基本要素(ACI...

  • Mysql事务

    1) mysql事务的ACID特性 2)MySQL事务隔离级别

  • mysql 行级锁深入分析

    schema主要是user_id 和 phone 用的是联合索引 测试的数据 查看mysql innodb 事务获...

  • 多线程对spring数据库事务影响

    1.spring事务的配置 以mysql为例: 2.编写测试例子 此例子中直接抛出RuntimeException...

网友评论

    本文标题:mysql 事务测试

    本文链接:https://www.haomeiwen.com/subject/rtndhqtx.html