当前位置:首页 >休闲 >不同于Oracle:MySQL的insert会阻塞update 分析MySQL的阻塞锁信息

不同于Oracle:MySQL的insert会阻塞update 分析MySQL的阻塞锁信息

2024-06-28 23:04:08 [百科] 来源:避面尹邢网

不同于Oracle:MySQL的不同insert会阻塞update

作者:王庆勋 数据库 MySQL 本文通过复现该问题,分析MySQL的阻塞锁信息,确认是不同MySQL与Oracle在并发事务处理上的差异,在进行数据库迁移改造的阻塞程序开发应予以关注。

某银行客户在从Oracle迁移到MySQL的不同开发中,MySQL在READ-COMMITTED隔离级别下,阻塞出现了insert阻塞update的不同情况,但同样的阻塞情况下,Oracle的不同insert则不会阻塞update。本文通过复现该问题,阻塞分析MySQL的不同锁信息,确认是阻塞MySQL与Oracle在并发事务处理上的差异,在进行数据库迁移改造的不同程序开发应予以关注。

1.问题复现

1.1.环境准备

MySQL版本的阻塞8.0.26,隔离级别是不同READ-COMMITTED ,测试表t的字段a为主键。

不同于Oracle:MySQL的insert会阻塞update 分析MySQL的阻塞锁信息

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.26 |
+-----------+
1 row in set (0.02 sec)

mysql> show variables like 'transaction_isolation';
+-----------------------+----------------+
| Variable_name | Value |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
+-----------------------+----------------+
1 row in set (0.00 sec)

mysql> desc t;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| a | int | NO | PRI | NULL | |
| b | int | YES | | NULL | |
+-------+------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> select * from t;
+---+------+
| a | b |
+---+------+
| 7 | 7 |
+---+------+
1 row in set (0.00 sec)

1.2. insert阻塞update的操作步骤

insert语句未提交时,update同样主键的数据会被阻塞。

不同于Oracle:MySQL的insert会阻塞update 分析MySQL的阻塞锁信息

session1

不同于Oracle:MySQL的insert会阻塞update 分析MySQL的阻塞锁信息

session2

插入一条数据(a=8)后未提交。

mysql> begin;

Query OK, 0 rows affected (0.00 sec)


mysql> insert into t values(8,8);

Query OK, 1 row affected (0.01 sec)



更改数据,条件是a=8,将会被阻塞

mysql> update t set b=0 where a=8;

<<挂起,等待innodb_lock_wait_timeout超时

2.分析原因

2.1.检查事务锁信息

mysql> select * from information_schema.innodb_trx\G

(责任编辑:热点)

    推荐文章
    热点阅读