Mysql事务实战


事务

pre

mysql8.0查看事务隔离级别的语句

SELECT @@transaction_isolation;

创建表

CREATE TABLE hero (
    number INT,
    name VARCHAR(100),
    country varchar(100),
    PRIMARY KEY (number)
) Engine=InnoDB CHARSET=utf8;

插入数据

INSERT INTO hero VALUES(1, '刘备', '蜀');

脏读

  1. 开启两个窗口,分别设置隔离级别
set session transaction_isolation='READ-UNCOMMITTED';
  1. 在第二个窗口中输入
BEGIN;
UPDATE hero SET name='关羽' WHERE number =1;
  1. 在第一个窗口中输入
BEGIN;
SELECT * FROM hero WHERE number=1;

不可重复读

  1. 设置事务隔离级别

两个终端都设置

 set session transaction_isolation='READ-COMMITTED';
  1. 终端1
BEGIN;
SELECT * FROM hero;
  1. 终端2
BEGIN;
UPDATE hero SET name='关羽' WHERE number=1;
COMMIT;
  1. 终端1
SELECT * FROM hero;

幻读

前排提醒,mysql的REPEATABLE-READ隔离级别已经解决了幻读问题,因此不能设置隔离级别为REPEATABLE-READ

  1. 终端1
BEGIN;
SELECT * FROM hero;
  1. 终端2
BEGIN;
INSERT INTO hero(number, name , country) VALUES(2, '关羽', '蜀');
COMMIT;
  1. 终端1
 SELECT * FROM hero;