mysql事务之提交读(Read Committed)
2016-03-29 21:46
302 查看
1,Read Commited定义:
在提交读(READ COMMITTED)级别中,基于锁机制并发控制的DBMS需要对选定对象的写锁(write locks)一直保持到事务结束,但是读锁(read locks)在SELECT操作完成后马上释放(因此“不可重复读”现象可能会发生,见下面描述)。和前一种隔离级别一样,也不要求“范围锁(range-locks)”。
简而言之,提交读这种隔离级别保证了读到的任何数据都是提交的数据,避免读到中间的未提交的数据,脏读(dirty reads)。但是不保证事务重新读的时候能读到相同的数据,因为在每次数据读完之后其他事务可以修改刚才读到的数据。
提交读保证我们读到的数据都是事务提交后的数据,这样子就保证了程序中数据的正确性,在我们的应用中,基本都是使用的Read Commited隔离级别。
2,场景
我们首先设置我们的数据库事务级别为提交读,开启事务1,对student表做更新,但是不对其提交,再开启事务2对数据进行读取。
start TRANSACTION;
select * from student;
update student set name = 'a1' where id = 1;
select * from student;
在该事务中,更新数据后,我们查看student表,其中的数据已经发生了变化。我们开启事务2对数据查询。
select * from student;
在该事务中查询到的student还是旧数据,对事务1进行提交,再在事务2中查询,数据则获取到的为我们最新的数据。
再次期间事务2和事务1中读取数据,事务1未提交时两个读取的数据不一致,可能发生不可重复读。
在提交读(READ COMMITTED)级别中,基于锁机制并发控制的DBMS需要对选定对象的写锁(write locks)一直保持到事务结束,但是读锁(read locks)在SELECT操作完成后马上释放(因此“不可重复读”现象可能会发生,见下面描述)。和前一种隔离级别一样,也不要求“范围锁(range-locks)”。
简而言之,提交读这种隔离级别保证了读到的任何数据都是提交的数据,避免读到中间的未提交的数据,脏读(dirty reads)。但是不保证事务重新读的时候能读到相同的数据,因为在每次数据读完之后其他事务可以修改刚才读到的数据。
提交读保证我们读到的数据都是事务提交后的数据,这样子就保证了程序中数据的正确性,在我们的应用中,基本都是使用的Read Commited隔离级别。
2,场景
我们首先设置我们的数据库事务级别为提交读,开启事务1,对student表做更新,但是不对其提交,再开启事务2对数据进行读取。
start TRANSACTION;
select * from student;
update student set name = 'a1' where id = 1;
select * from student;
在该事务中,更新数据后,我们查看student表,其中的数据已经发生了变化。我们开启事务2对数据查询。
select * from student;
在该事务中查询到的student还是旧数据,对事务1进行提交,再在事务2中查询,数据则获取到的为我们最新的数据。
再次期间事务2和事务1中读取数据,事务1未提交时两个读取的数据不一致,可能发生不可重复读。
相关文章推荐
- 优化mysql数据库性能的十个参数
- mysql事务之未提交读(Read uncommitted)
- 解压安装5.7以上版本的MySQL
- MySQL同时执行多条查询
- mysql数据库sql优化原则
- 详解mysql int类型的长度值问题
- mysql导入/导出CSV文件
- mysql 编码问题
- 添加mysql.h头文件
- MySql存储引擎
- mysql查询练习
- mysql TIMESTAMP详解
- MySQL的触发器
- win10下MySQL的zip安装记录
- MySQL开启慢查询
- mysql常用操作 mysql备份与恢复
- mysql配置的讲解 mysql的root密码重置 mysql的登录
- MySQL 索引
- mysql insert操作
- mysql导入导出sql文件