数据库事务&隔离级别

1.事务:作为一个单元的一组有序的数据库操作。

 

2.数据库事务(进行事务操作)的四大特征:

          <1>原子性:事务包含的操作不可分割,要么全部执行,要么全部回滚,不存在某一小部分执行成功的情况;

               例如:ATM机取款的一个事务操作,你需要 插卡--输入密码--取款金额1000--吐出现金1000--卡内余额会减少1000;取款成功需要每一步全部执行完成,否则全部回滚 事务操作失败。

          <2>一致性事务执行之前和执行之后必须处于一致性状态,事务执行使得数据库从一种正确的状态转换到另一种正确的状态;因此数据库指挥保存成功提交的事务,如果数据库故障导致部分数据存储不成功 就会使数据库处于一种不一致的状态(不正确);

             例如:A、B两人共有1000元,两人相互转账, 不管他们怎么转 转了多少次,到最后他们的金额合计还是1000元。

         <3>隔离性事务的执行不受其他并发事务的影响。一个事务内部操作及使用的数据对其他并发事务都是隔离的,并发执行的事务之间都是互不干扰的(事务未正确提交前,不允许把该事务对数据的任何改变提供给任何其他事务);

               例如:两个 事务A上车、事务B下车 可以并发执行,两个乘客可以同时在这一站上车和下车,而不是说 一个乘客在这一站下车的话 另一个乘客就不能上车了,这两个并发事务上车和下车之间是互不干扰的;

        <4>持久性:事务提交后 结果永久性的保存到数据库,不会无缘无故的回滚;

 

 3.不考虑事务的隔离性

     由隔离性我们可以看到多线程并发操作时,如果不考虑事务的隔离性 可能引发一下问题:

  • 脏读:一个事务的处理过程读取了另一个还没有提交的事务;
  • 不可重复读:一个事务范围内多次查询得到了不同的结果,因为查询间隔导致被另一个事务修改并提交 更新update 操作;
  • 虚读(幻读):“当事务A要对数据表中某个字段的所有值进修改操作,此时有一个事务是插入一条记录 并提交给数据库,当提交事务A 的用户再次查看时就会发现有一行数据未被修改,其实是事务B刚刚添加进去的”  这就是幻读 插入insert操作

 

4.数据库事务隔离级别

        针对于以上的情况 MySql提出了四种隔离级别

  •           Serializable (串行):采用锁表机制,隔离界别最高,效率最低;可避免脏读、不可重复读、幻读的发生。
  •           Repeatable read (可重复读):MySQL的默认级别;可避免脏读、不可重复读的发生。
  •     Read committed (读已提交):可避免脏读的发生。
  •     Read uncommitted (读未提交):最低级别,任何情况都无法保证。

 

                <1>  这四种从1--4级别由高到低,最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低;

             <2>Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,默认为Read committed级别 ;

                <3>查看MySQL隔离级别:select @@tx_isolation;

                <4>设置MySQL隔离级别:set @@tx_isolation;

                <5>查看MySQL隔离级级别一定要在开启事务之前;

        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值