数据库隔离级别
1:读未提交 - 一个Connection读取到了别的连接还没有提交的数据。Read uncommitted.
2:读已提交 - Read COMMITTED
3:可重复读 - Repeatable Read 一个Connection在自己的事务之内,读取到的永远是自己之前读取到的数据。4,默认值。保证在同一个Connection的事务之内,读取到的数据,具有一侄性。
4:序列化 - Sericable – 在一个Connection操作某个表时,会对这个表执行锁定。其他的connection必须要等待解锁。
一、读未提交示例操作过程-Read uncommitted
- 在免安装mysql的bin目录打开cmd窗口 输入 mysql -u root -p db_shop
打开两个MySql的命令提示行,均进入相同数据库,并检查当前表内容为相同数据如下:【数据表要支持事务】
- 在A、B两端执行select @@tx_isolation;检查当前默认的隔离级别别,可以发现都是
Repeatable Read – 可重复读-(在当前事务内,重复读取第一次读取过的数据就叫可重复读。)
- 修改A端的隔离级别为read uncommitted – 读未提交。意思是可以读取别人没有提交的数据。
set transaction isolation level read uncommitted;
在绿色的MySql5.5上请执行:
Set session transaction isolation level read uncommitted;
然后再查看是否已经发生改变:
- 在A、B两端都开启事务
start transaction;
- 在B端修改一行数据如:
update newscoce set sname=’Jhon’ where id=1;
其后在A端执行查询:select * from newscoce ;
- 此时B端再次执行回滚操作
Rollback;
再在A端进行查询,结果发现数据又回到了之前的数据。这就是脏读:
- 对于B端写入的新数据,如果没有提交A端也一样能查询到,这叫幻读。
需要注意的是,当执行完成一个操作,无论你是rollback还是commit,事务的隔离级别都会再回到默认级别,即:
Repeatable read。所以,要想演示必须重新设置A端的隔离级别。
二、读已提交操作过程:-read COMMITTED
- 检查A、B两端是否一致:
- 修改A端(左)的隔离级别为read committed;
set session transaction isolation level read committed;
在A端开启事务:
start transaction;
在B端开启事务
- 在A端进行查询:
Select * from newscoce ;
在B端修改一行记录并提交
Update newscoce set name=’itcx’ where id=1;
再回到A端进行查询,发现在同一个事务内,两次查询的结果不一样:
三、可重复读示例Repeatable Read
查看A端的隔离级别是否为Repeatable read级别(不是就设置下set session transaction isolation level Repeatable read;):
Select @@tx_isolation;
- 先在A端在开启的事务内进行查询。
然后在B端修改数据库的内容。
最后再在A端的同一事务内进行查询,发现结果一致,这就叫可重复读。
四、Serializable是最高级的隔离级别
- 在A端设置隔离级别为Serializable
set session transaction isolation level serializable;
在A端开启一个事务 start transaction; 并对Select * from newscoce ;表进行查询。
在B端开启一个事务 start transaction; 并写入一行记录。
此时发现B的代码并没有执行,因为它在等A提交之后它才执行。
类似于线程同步的概念