zoukankan      html  css  js  c++  java
  • 理解mysql数据库的事务特征,事务隔离级别,加锁机制

    <1>数据库事务的四大特性:
    原子性(A):事务中包括的操作,要么全做,要么全不做,事务作为一个整体被处理,不可以被分割。
    一致性(C):事务的执行结果,必须使数据库处于一致性状态,事务开始,处于一致性状态,事务结束,处于一致性状态。
    隔离性(I):一个事务执行的过程中,其他事物不能干涉。并发执行的事务间互不干涉,

    持久性(D):事务一旦提交,对数据库所做的修改是永久的。
    <2>数据库并发操作带来的问题。
    1.丢失更新:后一个事务更新的结果破坏了前一个事务更新的结果,导致前一个事务更新的结果丢失。
    例子:售票时,共b=20张,a卖出去1张,剩19张,结果此时b和a同时读取出20张,卖一张剩19张卖出两张票,却只减少了2张。
    2.不可重复读
    a事务读取数据为x时,b事务对x-1,此时a重复读数据x,却变成了x-1与原来的数据不相同。(两个select的结果不相同)
    3.读“脏数据”
    事务a对数据进行了修改,事务b读取到了事务a修改后的数据,但a因为某些原因发生了回滚,此时b读到的数据就是“脏数据”。
    <3>对事务并发的处理
    进行封锁处理,主要过程有:1.申请加锁。2.获得锁 3.释放锁
    锁类型:1.排它锁,独占锁,写锁(x锁) 2.共享锁,读锁(s锁)
    排它锁:事务a对一个对象加上锁后,只允许a对其进行读,写操作,其他事物不能读,不能修改,更不能再对该对象加锁,直至事务a释放该锁
    共享锁:事务a对一个对象加上共享锁后,其他事物只能再对该对象添加共享锁,不能加x锁。
    <4>死锁检测的方法
    1.超时法
    2.等待图法(是否存在回路)

    <4>事物的隔离级别
    1.Read uncommitted(读取未提交的)—-引发“脏读”
    2.Read Committed(读取提交了的)—–引发不可重复读。
    导致这种情况的原因可能有:(1)有一个交叉的事务有新的commit,导致了数据的改变;(2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit
    3.Repeatable Read(可重读,mysql默认的隔离级别)—幻读。
    4.Serializable(可串行化)
    (1)这是最高的隔离级别
    (2)它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。
    (3)在这个级别,可能导致大量的超时现象和锁竞争

  • 相关阅读:
    泛海精灵Alpha阶段回顾
    [Scrum]1.6
    【Scrum】1.5
    泛海精灵 Beta计划 (草案)
    【scrum】1.7
    学术搜索的Bug
    Linux下查看文件和文件夹大小
    求7的34次方
    去除给定的字符串中左边、右边、中间的所有空格的实现
    身份证18位验证
  • 原文地址:https://www.cnblogs.com/wangxiaopei/p/8551215.html
Copyright © 2011-2022 走看看