mysql事务的隔离级别案例

需要的命令:

SHOW VARIABLES LIKE 'autocommit'   (ON 自动提交 OFF不是自动提交 需要手动  COMMIT;)

两种方式设置mysql 自动提交事务和关闭自动提交事务(mysql默认自动提交事务)

              关闭自动提交事务                   开启自动提交事务
 第一种  SET autocommit=off;               SET autocommit=ON;

 第二种  SET autocommit=0;                 SET autocommit=1;  

打开两个cmd mysql 黑窗口

 可以看到id为2 的数据

现在将数据库中的数据更改掉

 

 这个时候我们看到手动提交事务那到的是老数据, 自动提交的拿到的是新数据

以及新增记录,也并没有那到新的数据

 这个是因为mysql 默认的隔离级别导致的,

读未提交:是读取别的事务没提交数据。产生脏读问题  容易读到脏数据。

读已提交:是读取别的事务以及提交的数据,这个隔离级别 解决了脏读的现象, 但是他有不可重复读取数据问题。

什么是不可重复读取数据呢?
在事务开启之后,第一次读到的数据是3条,当前事务还没有结束,可能第二次再读取的时候,读到的数据是4条,3不等于4称为不可重复读取

这种隔离级别是比较真实的数据,每一次读到的数据绝对真实。

oracle 数据库默认的隔离级别是读已提交。
 

mysql的默认隔离级别是可重复度:可重复读:repeatable read
什么是可重复读取?(提交之后也读不到,永远读取的都是刚开启事务时的数据)
事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读。

提交之后也读不到,永远读取的都是刚开启事务时的数据,早晨9点开始开启了事务,只要事务不结束,到晚上9点,读到的数据还是那样的数据。读到的是假象。不够绝对的真实。 所以这个隔离级别有幻读的问题

幻读:同时有A,B两个事务,ide是主键,B 插入了一条id=10的数据,提交了 。A :select * from b where id=10; 结果为null,发现没有id=10的数据,他就插入一条id=10数据,发现insert不进去,说主键重复。A又select一次,发现还是没有id=10的数据,可就是insert不进去,就和幽灵一样,所以称为幻读
脏读,不可重复读的区别。不可重复读只有在其他事务提交了,多次select的状态才会改变。

幻读,不可重复读,针对的都是另一方已经提交的事务,不可重复读,对其他已经提交的事务,select会发现和上次不一样。而幻读select都是一样。不过如果别人新增了id=10,他虽然select没有看到,但就是insert不进去。
 

注意:如果是自动提交,未设置手动提交,则可以看到别的事务修改的数据,不会产生幻读问题

序列化/串行化: serializable(最高的隔离级别)
这是最高隔离级别,效率最低。解决了所有的问题。这种隔离级别表示事务排队,不能并发!
synchronized,线程同步(事务同步)
每一次读取到的数据都是最真实的,并且效率是最低的。l
 

所以,只需要将手动提交的黑窗口 commit 一下就可以了。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值