zoukankan      html  css  js  c++  java
  • MySQL事务以及加锁机制

    事务的特征ACID,即原子性、一致性、隔离性、持久性。

    原子性保证一个事务为一个最小的单元,内部不可分割;

    一致性保证事务中的每个操作线程不可单独提交,成功则一起提交,不成功则事务回滚;

    隔离性保证不同事务间看到的数据视图相互独立,相互隔离(隔离级别可设置);

    持久性保证事务提交后数据会持久的保存下来;

    sql规范定义的事务的隔离级别:

    1.READ UNCOMMITTED(读取未提交内容)

    所有事务可以看到未提交事务的执行结果,本隔离级别很少用到实际应用中,读取未提交的数据,又称为“脏读”。

    2.READ COMMITTED(读取提交内容)

    大多数数据库的默认隔离级别是此级别,但不是mysql默认的。一个事务在开始的时候只能看见已提交事务所做的改变。一个事务从开始到提交前所做的任何改变都是不可见的,除非提交。这种隔离级别也称为不可重复读。

    3.REPEATABLE READ(可重复读)

    锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中 。此级别也称为“幻读”。

    4.SERIALIZABLE(可串行化)

    可串行化是最高的隔离级别,它通过强制事务排序,使之不可重读,解决了幻读的问题。此隔离级别会在每个读的数据行上加共享锁,使用这种隔离级别会产生大量的超时现象,一般实际开发中不会用到。

    mysql加锁机制 :

    根据类型可分为共享锁(SHARED LOCK)和排他锁(EXCLUSIVE LOCK)或者叫读锁(READ LOCK)和写锁(WRITE LOCK)。

    根据粒度划分又分表锁和行锁。表锁由数据库服务器实现,行锁由存储引擎实现。

    mysql提供了3种事务型存储引擎,InnDB、NDB Cluster和Falcon。

    一个事务执行的任何过程中都可以获得锁,但是只有事务提交或回滚的时候才释放这些锁。这些都是隐式锁定,也可以显式锁定,InnoDB支持显式锁定,例如:

    SELECT .... LOCK IN SHARE MODE (加共享锁)

    SELECT .....FOR UPDATE(加排他锁)

    多版本并发控制(重要):

    Mysql的事务存储引擎不是简单实用行加锁机制,而是叫多版本并发控制(MVCC)技术,和行加锁机制关联实用。以便应对更高的并发,当然是以消耗性能作为代价。

    每种存储引擎对MVCC的实现方式不同,InnoDB引擎的简单实现方式如下:

    InnoDB通过为每个数据航增加两个隐含值的方式来实现。这两个隐含值记录了行的创建时间,以及过期时间。每一行存储事件发生时的系统版本号。每一次开始一个新事务时版本号会自动加1,每个事务都会保存开始时的版本号,每个查询根据事务的版本号来查询结果。

  • 相关阅读:
    codevs 1569 最佳绿草

    luogu P3378 【模板】堆
    cogs 762. [USACO Open09] 奶牛队列
    各种 Python 实现的简单介绍与比较
    与 的区别
    Python3 print()函数sep,end,file参数用法练习
    python基础
    servlet篇 之 跳转问题
    servlet篇 之 servlet的访问
  • 原文地址:https://www.cnblogs.com/out8/p/4222166.html
Copyright © 2011-2022 走看看