数据库事物隔离四种级别详解
2018-06-17 23:23:58来源:未知 阅读 ()
数据库事物隔离级别有四种,按照隔离性,由低到高依次是:1.Read Uncommitted
2.Read Committed
3.Repeatable Read
4.Serializable
按照并发性则顺序相反。
√: 可能出现 ×: 不会出现
脏读 | 不可重复读 | 幻读 | |
Read uncommitted(未提交读) | √ | √ | √ |
Read committed(已提交读) | × | √ | √ |
Repeatable read(可重复读) | × | × | √ |
Serializable(可串行化) | × | × | × |
1.Read uncommitted
读未提交,即在SQL查询中,读取了未提交的数据。在mysql中,默认的事物级别是Repeatable read;默认自动提交模式是打开的,现做如下修改如下所示,
(1)关闭自动提交
mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ 1 row in set (0.00 sec) mysql> set autocommit = 0; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | OFF | +---------------+-------+ 1 row in set (0.01 sec)
(2)修改事物级别为Read uncommitted
mysql> show variables like 'tx_isolation'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | tx_isolation | REPEATABLE-READ | +---------------+-----------------+ 1 row in set (0.00 sec)
mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Query OK, 0 rows affected (0.00 sec)
当前打开了两个session,在第一个,往表test中插入了一行数据,但是还没有提交,此时通过第二个session可以查询到该条数据。
且当第一个session中的事物rollback之后,第二个session又查询不到新插入的数据‘3’
2.Read Committed
读提交,修改事物几倍为Read Committed
mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; Query OK, 0 rows affected (0.00 sec) mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED; Query OK, 0 rows affected (0.00 sec)
此时,在session0中插入了一条数据且未commit,在session1中无法查询到
等session0在commit之后,session1可以正常的查询到数据
3.Repeatable read
可重复读,此时修改事物级别为可重复读
mysql> SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; Query OK, 0 rows affected (0.00 sec) mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ; Query OK, 0 rows affected (0.00 sec)
此时,test表中存在两笔数据:2和4,如下所示
mysql> select * from test where col1 <'5'; +------+ | col1 | +------+ | 2 | | 4 | +------+ 2 rows in set (0.00 sec)
此时步骤如下:1.在session0中begin一个事物;
2.在session1中插入一条数据(5),并commit;
3.在session0中查询,发现查询不到在session1中插入的数据
接下来,再做如下操作:1.在session0中commit;
2.在session0中再做查询操作,发现之前在session1中insert的5又可以查询到
4.Serializable
可串行话,是最高的隔离级别,即在读取的每一行数据上会加锁,事物顺序执行。所以会出现锁超时等问题,在实际业务中很少使用。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:binlog2sql使用总结
下一篇:bonecp回缩功能实现
- MySQL性能优化的20条经验 2019-09-23
- 一份非常完整的MySQL规范 2019-09-17
- 数据库读写分离提高性能详解,原理是什么 2019-08-26
- 我们日常使用的数据库的数据都储存在哪里呢? 2019-08-23
- MySQL在并发场景下的问题及解决思路 2019-08-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash