zoukankan      html  css  js  c++  java
  • 数据库事务

    四大特性:ACID

      1、原子性(Atomicity,或称 不可分割性):一批操作,要么全部成功,要么全部不成功。

      2、一致性(Consistency):结果唯一、精确、无脏数据。

      3、隔离性(Los): 多个事务并发的时候,保证各个事务之间的隔离性。

      4、持久性(Durability): 将数据存入硬盘。

    事务的隔离性:

    隔离级别 脏读取 不可重复读 幻读
    读未提交(Read  Uncommitted)  yes  yes  yes
    读提交(Read Committed)  no  yes  yes
    可重复读(Repeatable Read)  no  no  yes
    串行化(Serializable)  no  no  no

    脏读取:一个事务在执行过程中,读取了另外一个事务未提交的数据。

    不可重复读:一个事务中多次查询结果不唯一。首次查询与再次查询间隔间,另外一个事务提交,导致的结果不一致。(修改或删除)

    幻读:(数据的新增)

      事务a,执行查询操作,得到 3 条记录。

      事务b,执行查询操作,得到 3 条记录。

      事务b,执行 insert 操作,将一条记录插入表中,并提交事务。

      事务a,执行查询操作,由于隔离性(快照读取),结果依然为 3 条记录。当事务a,执行 insert 操作时,发现表中已经存在id = 4的记录了,就跟产生了幻觉一样。

    mysql InnoDB MVCC (Multiversion Concurrency Control ,多版本控制)

      它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能。

    读锁:也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

    写锁:又称排他锁、X锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

    表锁:操作对象是数据表。Mysql大多数锁策略都支持(常见mysql innodb),是系统开销最低但并发性最低的一个锁策略。事务t对整个表加读锁,则其他事务可读不可写,若加写锁,则其他事务增删改都不行。

    行级锁:操作对象是数据表中的一行。是MVCC技术用的比较多的,但在MYISAM用不了,行级锁用mysql的储存引擎实现而不是mysql服务器。行级锁对系统开销较大,处理高并发不够好。InnoDB MVCC 比行锁性能好。

      InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID),每开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID。

    select   

      InnoDB会根据以下两个条件检查每行记录::
      a.InnoDB只会查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的.。
      b.行的删除版本要么未定义,要么大于当前事务版本号,这可以确保事务读取到的行,在事务开始之前未被删除.。
      只有a,b同时满足的记录,才能返回作为查询结果。

    update

      InnoDB会为删除的每一行保存当前系统的版本号(事务的ID)作为删除标识.。
      InnoDB执行UPDATE,实际上是新插入了一行记录,并保存其创建时间为当前事务的ID,同时保存当前事务ID到要UPDATE的行的删除时间。

    delete,insert 可以根据上面的结论,进行推导。

    oracle 中解决幻读使用的技术:undo (待补充。。。)

    注意:事务的隔离级别和数据库并发性是成反比的,隔离级别越高,并发性越低。

  • 相关阅读:
    原创 C++应用程序在Windows下的编译、链接(四)动态链接
    IE浏览器 json异常
    Linux系统github使用
    Mysql in 排序
    转 php四种基础算法:冒泡,选择,插入和快速排序法
    转 mysql取今天,明天,工作日,周末,本周,下周,下月数据
    下载远程图片到本地
    转 PHP中SQL_CALC_FOUND_ROWS与FOUND_ROWS()和count()
    星级点评
    21个值得收藏的Javascript技巧
  • 原文地址:https://www.cnblogs.com/chen--biao/p/9842276.html
Copyright © 2011-2022 走看看