MySQL 隔离级别测试总结
MySql 隔离设置相关命令
show variables like 'tx_isolation'
select @@global.tx_isolation;
set global tx_isolation='READ-UNCOMMITTED'; 未提交读
set global tx_isolation='READ-COMMITTED';
set global tx_isolation='REPEATABLE-READ';
set global tx_isolation='SERIALIZABLE';
隔离级别
一、未提交读(READ-UNCOMMITTED)
操作类型 | 事务提交前其他人是否可以看到 | 其他人更新记录后是否影响这次事务结果 | 后果 |
插入 | 可以 | 会 | 脏读,不可重复读、幻读 |
更新 | 可以 | 会 | |
删除 | 看不到记录了 | 会 |
结论:安全性最低,性能最快,一般不用这个级别,会导致很多问题。
二、提交读/不可重复读(READ-COMMITTED/NOREPEATABLE READ)
操作类型 | 事务提交前其他人是否可以看到 | 其他人更新记录后是否影响这次事务结果 | 后果 |
插入 | 不可以 | 会 | 不可重复读、幻读 |
更新 | 不可以 | 会 | |
删除 | 还能看到记录 | 会 |
结论:安全性略低,性能一般,很多数据用这个级别(mysql不是)。
三、可重复读(REPEATABLE-READ)
操作类型 | 事务提交前其他人是否可以看到 | 其他人更新记录后是否影响这次事务结果 | 后果 |
插入 | 不可以 | 不会 | 幻读(实际数据没了或改变了,但这个事务的数据未提交前不会变化) |
更新 | 不可以 | 不会 | |
删除 | 还能看到记录 | 不会 |
结论:安全性一般,性能较快,mysql默认这个级别
四、串行化(SERIALIZABLE)
操作类型 | 事务提交前其他人是否可以看到 | 其他人更新记录后是否影响这次事务结果 | 后果 |
插入 | 不可以 | 阻塞 | 安全性最高,性能最差 |
更新 | 不可以 | 阻塞 | |
删除 | 还能看到记录 | 阻塞 |
结论:应用于安全度很高的项目