一、事务
事务是由一组SQL语句组成的逻辑处理单元。
事务的特征ACID,即原子性、一致性、隔离性和持久性。
原子性(Atomicity)事务作为整体执行,操作要么全部执行、要么全部不执行。
一致性(Consistent)事务应该确保数据库状态从一个一致状态转变为另一个一致状态。
隔离性(Isolation)多个事务并发执行时,一个事务执行不影响其他事务执行(隔离级别可设置)。
持久性(Durable)事务提交后,对数据库的修改应该永久保存在数据库中。
二、事务的隔离级别
1、读未提交(Read Uncommited,RU)
这种隔离级别下,事务间完全不隔离,会产生脏读,可以读取未提交的记录,实际情况下不会使用。
读取未提交的数据,又称为“脏读”。
2、读提交(Read commited,RC)
仅能读取到已提交的记录,这种隔离级别下,会存在幻读现象,所谓幻读是指在同一个事务中,多次执行同一个查询,返回的记录不完全相同的现象。幻读产生的根本原因是,在RC隔离级别下,每条语句都会读取已提交事务的更新,若两次查询之间有其他事务提交,则会导致两次查询结果不一致。虽然如此,读提交隔离级别在生产环境中使用很广泛。
3、可重复读(Repeatable Read,RR)
可重复读解决了幻读问题。不是所有的数据库都实现了该隔离级别。
4、串行化(Serializable)
在串行化隔离模式下,消除了脏读、幻读,但事务并发度急剧下降,事务的隔离级别与事务的并发度成反比,隔离级别越高,事务的并发度越低。实际生产环境下,dba会在并发和满足业务需求之间做权衡,选择合适的隔离级别。
三、关于锁
1、MySQL常用存储引擎的锁机制:
MyISAM和MEMORY采用表级锁(table-level locking)
BDB采用页面锁(page-level locking)或表级锁,默认为页面锁
InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
2、各种锁特点:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
3、各种锁的适用场景:
表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用
行级锁则更适合于有大量按索引条件并发更新数据,同时又有并发查询的应用,如一些在线事务处理系统
4、死锁:
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB.
mysql小记--基础知识
原文:http://www.cnblogs.com/xiaoxian1369/p/5194321.html