Lock

Lock

锁粒度(Lock Granularity)

一种提高资源并发性的方法就是让锁定的对象更有选择性。

表锁(Table Lock)

MySQL 支持大多数基本的锁策略,其中开销最小的锁策略是表锁。表锁类似于邮箱加锁机制:将整个表加锁。当一个用户对表进行写操作(如插入、删除、更新时),用户可以获得一个写锁。写锁会禁止其他任何用户的读/写操作。另外,只有无人做写操作时,用户才能获得读锁,读锁之间是互不冲突的。

行级锁(Row Locks)

读锁(Read Lock)/写锁(Write Lock)

事务

原子性(Atomicity)

一个事务必须被视为一个单独的内部“不可分”的工作单元,以确保整个事务要么全部执行,要么全部回滚。当一个事务具有原子性时,该事务绝对不会被部分执行,要么完全执行,要么完全不执行。

一致性(Consistency)

数据库总是从一种一致性状态转换到另一种一致性状态。

隔离性(lsolation)

某个事务的结果只有在完成之后才对其他事务课件。

持久性(Durability)

一旦一个事务提交,事务所做的数据改变将是永久的。这意味着数据改变已被记录,即使系统崩溃,数据也不会因此丢失,持久性是个优点模糊的概念,因为实际上持久性也分很多级别。有些持久性策略提供一种强壮的安全保证,另一些则未必。另外,也没有什么东西是 100% 永远持久的。

隔离级

SQL 标准定义了 4 类隔离剂,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离剂一般支持更高的兵法处理,并拥有更低的系统开销。

READ UNCOMMITTED(读未提交内容)

所有事务都可以“看到”未提交事务的执行结果。在这种级别上,可能会缠身过很多问题,除非用户真的知道自己在做什么,并有很好的理由选择这样做。本隔离级很少用于实际应用,因为它的性能也不比其他级别好多少,而别的级别还有其他更多的优点。读取未提交数据,也被都称之为“脏读”(Dirty Read)。

READ COMMITTED(读取提交内容)

大多数数据库系统的默认隔离级别是 READ COMMITTED(MySQL 默认的不是这个)。它满足了隔离的早先简单定义:一个事务在开始时,只能“看见”已经提交事务所做的改变,一个事务从开始到提交前,所做的任何数据改变都是不可见的,除非已经提交。这种隔离级别也支持所谓的“不可重复读”(Nonrepeatable Read)。这意味着用户运行同一语句两次,看到的结果是不同的。

REPEATABLE READ (可重读)

REPEATABLE READ隔离级解决了 READ UNCOMMITTED 隔离级导致的问题。他确保同一事务的多个实例在并发读取数据时,会”看到同样的“数据行。

SERIALIZABLE(可串行化)

SERIALIZABLE 是*别的隔离级,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。