今天测试一下隔离性,一直不行,原来没看到表的类型是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复习总结
为了方便记忆与理解用一条流水线来描述:事务隔离性分别为:未提交读(产生脏读)->不可重复读(解决脏读,出现幻读)->可重复读(解决幻读,但没有解决以上的一致性问题) ->可串行化(不利于线程并发,容易造成堵塞情况)
浙公网安备 33010602011771号