数据库隔离级别与实践

数据库隔离级别

1:读未提交 - 一个Connection读取到了别的连接还没有提交的数据。Read uncommitted.

2:读已提交 - Read COMMITTED

3:可重复读 -  Repeatable Read 一个Connection在自己的事务之内,读取到的永远是自己之前读取到的数据。4,默认值。保证在同一个Connection的事务之内,读取到的数据,具有一侄性。

4:序列化 - Sericable – 在一个Connection操作某个表时,会对这个表执行锁定。其他的connection必须要等待解锁。

一、读未提交示例操作过程-Read uncommitted

  1. 在免安装mysql的bin目录打开cmd窗口 输入 mysql -u root -p db_shop
    打开两个MySql的命令提示行,均进入相同数据库,并检查当前表内容为相同数据如下:【数据表要支持事务】

  1. 在A、B两端执行select @@tx_isolation;检查当前默认的隔离级别别,可以发现都是

Repeatable Read – 可重复读-(在当前事务内,重复读取第一次读取过的数据就叫可重复读。)

  1. 修改A端的隔离级别为read uncommitted – 读未提交。意思是可以读取别人没有提交的数据。

set transaction isolation level read uncommitted;

在绿色的MySql5.5上请执行:

Set session transaction isolation level read uncommitted;

   然后再查看是否已经发生改变:

  1. 在A、B两端都开启事务

start transaction;

  1. 在B端修改一行数据如:

update newscoce set sname=’Jhon’ where id=1;

   其后在A端执行查询:select * from newscoce ;

  1. 此时B端再次执行回滚操作

Rollback;

   再在A端进行查询,结果发现数据又回到了之前的数据。这就是脏读:

  1. 对于B端写入的新数据,如果没有提交A端也一样能查询到,这叫幻读。

需要注意的是,当执行完成一个操作,无论你是rollback还是commit,事务的隔离级别都会再回到默认级别,即:

Repeatable read。所以,要想演示必须重新设置A端的隔离级别。

 

二、读已提交操作过程:-read COMMITTED

  1. 检查A、B两端是否一致:

  1. 修改A端(左)的隔离级别为read committed;

set session transaction isolation level read committed;

   在A端开启事务:

   start transaction;

   在B端开启事务

  1. 在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;

  1. 先在A端在开启的事务内进行查询。

然后在B端修改数据库的内容。

最后再在A端的同一事务内进行查询,发现结果一致,这就叫可重复读。

四、Serializable是最高级的隔离级别

  1. 在A端设置隔离级别为Serializable

set session transaction isolation level serializable;

在A端开启一个事务 start transaction; 并对Select * from newscoce ;表进行查询。

在B端开启一个事务  start transaction; 并写入一行记录。

此时发现B的代码并没有执行,因为它在等A提交之后它才执行。

类似于线程同步的概念

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值