MySQL事务

事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。程序和事务是两个不同的概念。一般而言:一段程序中可能包含多个事务。(说白了就是几步的数据库操作而构成的逻辑执行单元)

  1. 事务具有四个特性:
    原子性 A (Actomicity):事务是一个原子操作单元。在当时原子是不可分割的最小元素,其对数据的修改,要么全部成功,要么全部都不成功。
    一致性 C(Consistent):事务开始到结束的时间段内,数据都必须保持一致状态。
    隔离性I(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的"独立"环境执行。
    持久性D(Durable):事务完成后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。
    2.事务并发的三大问题
    a.脏读(未commit):未提交读;也就是说,一个事务正在对一条记录做修改,在这个事务完成并提交之前,这条数据是处于待定状态的(,这时,第二个事务来读取这条没有提交的数据,并据此做进一步的处理,就会产生对未提交的数据的依赖关系。这种现象被称为脏读。
    b.不可重复读(update/delete出现,commit之后):一个事务先后读取同一条记录,事务在两次读取之间该数据被其它事务所修改,则两次读取的数据不同,称之为不可重复读。
    c.幻读(insert出现,commit之后):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。
  2. 四种事务隔离级别
    1)未提交读(READ_UNCOMMITTED): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。不解决任何问题
    2)已提交读(READ_COMMITTED):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。解决脏读问题
    3)可重复读(REPEATABLE_READ): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。解决不可重复读问题
    4)串行化(SERIALIZABLE):最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。解决所有问题
    Mysql 默认采用的 REPEATABLE_READ隔离级别

MySQL事务与锁详解

MySQL锁

MyISAM和InnoDB存储引擎使用的锁:
MyISAM采用表级锁(table-level locking)。
InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁

表级锁和行级锁对比:
表级锁: Mysql中锁定 粒度最大 的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定粒度最大,触发锁冲突的概率最高,并发度最低,MyISAM和 InnoDB引擎都支持表级锁。
行级锁: Mysql中锁定 粒度最小 的一种锁,只针对当前操作的行进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。

相关文章: