今天测试一下隔离性,一直不行,原来没看到表的类型是MyISAM;所以我找了一个Innodb的表m_advertisement 来做测试

一、测试‘READ-UNCOMMITTED’隔离性  打开两个navicat窗口T1和T2, 在T1和T2之前都要设置一下autocommit与tx_isolation

T1

SHOW VARIABLES like '%autocommit%'
set autocommit=0
select @@tx_isolation
set tx_isolation='READ-UNCOMMITTED';

-- 1步骤
-- BEGIN;
-- SELECT * from m_advertisement WHERE id=11; -- 有展示

-- 3步骤
-- SELECT * from m_advertisement WHERE id=11;-- 无展示
-- 5步骤
-- SELECT * from m_advertisement WHERE id=11; -- 有展示



T2

 SHOW VARIABLES like '%autocommit%'
 set autocommit=0
select @@tx_isolation
set tx_isolation='READ-UNCOMMITTED';


-- 2步骤

-- UPDATE m_advertisement set id=1 WHERE id=11
-- 4步骤
-- ROLLBACK;





-- 表明‘未提交读隔离性’每次都是读最新版本,把没提交的版本也读到了

  

 

二、测试‘READ-COMMITTED’隔离性  打开两个navicat窗口T1和T2, 在T1和T2之前都要设置一下autocommit与tx_isolation

事务T1  (set autocommit=0  不要自动提交 并且  set tx_isolation='READ-COMMITTED';  设置为提交读隔离性 )
SHOW VARIABLES like '%autocommit%'
set autocommit=0
select @@tx_isolation
set tx_isolation='READ-COMMITTED';
-- 1步骤
-- BEGIN;
-- SELECT * from m_advertisement WHERE id=1; 有展示

-- 3步骤
-- SELECT * from m_advertisement WHERE id=1; 有展示
-- 5步骤
-- SELECT * from m_advertisement WHERE id=1; 无展示

事务T2  (set autocommit=0  不要自动提交 并且  set tx_isolation='READ-COMMITTED';  设置为提交读隔离性 )

SHOW VARIABLES like '%autocommit%'
set autocommit=0
select @@tx_isolation
set tx_isolation='READ-COMMITTED';
-- 2步骤
-- BEGIN;
-- UPDATE m_advertisement set id=11 WHERE id=1
-- 4步骤
-- COMMIT;

--- 表明提交读隔离性,在未提交的时候,读不到,提交的时候就读到了,避免了脏读,但是出现了不可重复读(update的情况)

  

  

三、测试‘REPEATABLE-READ’隔离性 打开两个navicat窗口T1和T2, 在T1和T2之前都要设置一下autocommit与tx_isolation
T1
--  SHOW VARIABLES like '%autocommit%'
-- set autocommit=0
-- select @@tx_isolation
-- set tx_isolation='REPEATABLE-READ';


-- 1步骤
--  BEGIN;
--  SELECT * from m_advertisement WHERE id=11;  -- 有展示

-- 3步骤
--   SELECT * from m_advertisement WHERE id=11;--  有展示
-- 5步骤
--     SELECT * from m_advertisement WHERE id=11; -- 有展示

T2

--  SHOW VARIABLES like '%autocommit%'
-- set autocommit=0
-- select @@tx_isolation
-- set tx_isolation='REPEATABLE-READ';
-- 2步骤
-- BEGIN;
-- UPDATE m_advertisement set id=1 WHERE id=11
-- 4步骤
 --  COMMIT;

-- 验证可重复读隔离性一直都是读取最开始的版本,而不是最新的版本,避免了幻读的情况(insert的情况)

  

 

三、测试‘SERIALIZABLE’隔离性 打开两个navicat窗口T1和T2, 在T1和T2之前都要设置一下autocommit与tx_isolation
T1
-- SHOW VARIABLES like '%autocommit%'
-- set autocommit=0
--  select @@tx_isolation
-- set tx_isolation='SERIALIZABLE';

-- 1步骤
    BEGIN;
  SELECT * from m_advertisement WHERE id<100;  -

-- 3步骤
  COMMIT;--  T2不阻塞了

T2 -- T2是2020.12.12补上去的 -- SHOW VARIABLES like '%autocommit%' -- set autocommit=0 -- select @@tx_isolation -- set tx_isolation='SERIALIZABLE'; -- 2步骤 -- BEGIN; -- INSERT INTO `m_advertisement` VALUES (88, 'http://www.havelove.club/yddata/album/img196/1/70103f33-cabc-4d43-af77-e75b56d9d950.jpg', 'http://www.baidu.com', '百度图片测试', '#fcd8a8', 1, '2019-5-31 22:59:11'); -- 处于等待状态 --- 表明 序列化隔离性会产生阻塞,保证了一致性

 

 --2020.12.12复习总结

为了方便记忆与理解用一条流水线来描述:事务隔离性分别为:未提交读(产生脏读)->不可重复读(解决脏读,出现幻读)->可重复读(解决幻读,但没有解决以上的一致性问题) ->可串行化(不利于线程并发,容易造成堵塞情况) 

posted on 2020-01-14 00:15  我是坏男孩  阅读(291)  评论(0)    收藏  举报