读书笔记:数据库并发控制-事务与锁

1、事务(Transaction)

事务:一组原子性的SQL操作,一个独立的工作单元。

事务的ACID特性:

原子性(Automicity):事务是一个不可分割的最小工作单元。一个事务中的所有操作要么全部成功提交(commit),要么全部失败回滚(rollback)。

一致性(Consistency):数据总是从一个一致性的状态转换到另一个一致性的状态。一致性状态是指数据库满足数据的完整性约束(实体完整性约束,参照完整性约束,用户自定义完整性约束)

隔离性(Isolation):一个事务对数据所作的修改在提交之前,对其他事务是不可见的。或者说,多个事务并发执行时,一个事务的执行不影响其他事务的执行。

持久性(Durability):已提交事务对数据的修改永久保存在数据库中。

 

2、事务隔离级别(Isolation Level)

隔离级别:事务在执行过程中是否能够看见其他并发事务对数据的修改。

四种隔离级别

未提交读(Read Uncommitted):事务中的数据修改,即使事务未提交,对其他事务也是可见的。事务可以读取未提交的数据,也称为“脏读”。

提交读(Read Committed):事务开始时,只能看见已提交事务的修改。换句话说,一个事务从开始到提交之前,所作的任何操作对其他事务是不可见的。但是如果在事务执行过程中,有其它事务提交修改,那么前后两次读取相同记录的结果不相同(不一致),也称作不可重复读(nonrepeatable read)。

可重复度(Repeatable Read):事务中前后两次读取相同记录的结果是一致的,即使有事务提交。可重复度可以解“决脏”的问题,但是存在幻读(Phantom Read)的问题,当事务在读取某个范围内记录的时候,如果另外一个事务插入了新的数据记录,之前的事务中再次读取该范围内的数据记录,那么将会产生幻行(Phantom Rows)。InnoDB通过使用多版本并发控制MVCC解决了幻读的问题。

可串行化(Serializable):事务串行化执行。

 

3、锁(Locks)

读锁(共享锁):相互不阻塞,可以在同一时刻读取同一个资源,即在同一个资源上可以同时添加多个读锁。

写锁(排他锁):阻塞其他读锁或写锁,独占资源,在给定的时间内只允许一个用户写入。

 

4、锁粒度(Lock Granularity)

锁粒度:加锁对象(资源)的大小。锁粒度的大小影响的系统的并发性和系统开销。当锁粒度较小,可以提高资源的并发使用,但是也增加的系统加锁的开销。反之,锁粒度越大,并发度越低,

表锁(table locks):在整张表上进行加锁,如MyISAM引擎。
行锁(row locks):在表中的一行或者多行数据记录上加锁。
页锁(page locks):目前只有BDB存储引擎使用。
元数据锁(Metadata Locks):MySQL5.5中引入,应用在表的metadata上。当一个线程使用表的时候,将会锁定整张表的metadata信息,不允许其他线程修改表结构。

 

5、区分锁与隔离级别

个人认为锁与事务的隔离级别不存在任何关系,但是我们有时候经常被这两个概念弄混淆。
锁与事务隔离级别都是为了保证在多线程并发环境下,数据访问的安全性。当时事务交叉执行时,如果不设置事务的隔离级别(事务存在还有意义吗?),那么数据将会被不同事务轮访问和修改,执行结果无法预期。

1、加锁与解锁时机:当开始执行SQL,将会对一些数据进行加锁,如整个表,某些行,metadata信息。当sql执行完成,将会解锁,其他线程就可以开始申请使用资源。

2、MySQL事务特性是由存储引擎提供的,如常用的InnoDB。一个事务由一个或者多个SQL组成,事务的隔离性进一步确保在多线程并发环境下数据的安全访问,直接决定事务中sql修改的数据在提交之前是否对其他事务是否可见。

此条目发表在mysql分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.