某银行客户在从Oracle迁移到MySQL的不同开发中,MySQL在READ-COMMITTED隔离级别下,阻塞出现了insert阻塞update的不同情况,但同样的阻塞情况下,Oracle的不同insert则不会阻塞update。本文通过复现该问题,阻塞分析MySQL的不同锁信息,确认是阻塞MySQL与Oracle在并发事务处理上的差异,在进行数据库迁移改造的不同程序开发应予以关注。
MySQL版本的阻塞8.0.26,隔离级别是不同READ-COMMITTED ,测试表t的字段a为主键。
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)
insert语句未提交时,update同样主键的数据会被阻塞。
session1 | 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超时 |
mysql> select * from information_schema.innodb_trx\G(责任编辑:热点)
天津证监局召开2022年辖区期货监管工作会议 结合实际提出监管要求
复古FPS《最后的根除者》上架steam DEMO9月28日上线
安徽:截止10月底各级财政累计拨付民生工程资金1213.2亿元