本节内容:
mysql中的锁、事务、并发控制
1、并发控制
无论何时,只要不止一个查询同时修改数据,都会产生并发控制问题--并发读和并发写。
读锁(Read Lock)/写锁(Write Lock)
锁系统是用于处理并发读或并发写时出现的数据不一致等问题。也称为共享锁(Share Lock)和排他锁(Exclusive Lock)。
锁的概念:
某一资源上的读锁是共享的,或者说是互不阻塞的。在同一时间,多个用户可以读取同一资源,而互不干扰。
另一方面,写锁是排他的,一个写锁会阻塞其他的读锁和写锁,这是出于安全策略的考虑,在给定时间里,只有一个用户能写入资源,以防止用户在写操作的同时其他用户读取同一资源。
对数据库来说,随时随地都会发生锁定。当某一用户修改某一部分数据时,MySQL会禁止其他用户读取同一数据。
大多数时候,MySQL都是以透明的方式实现锁的内部管理。
每种mysql存储引擎都可以实现独有的锁策略(Locking Policy)或锁粒度(Lock Granularitey)。
在存储引擎设计中,锁管理(Lock Management)是个非常重要的议题。
接下来,介绍两种最重要的锁策略。
2、表锁(Table Lock)
MySQL支持大多数基本的锁策略,其中开销最小的锁策略是表锁。将给个表枷锁。当一个用户对表进行写操作时,用户可以获得一个写锁。写锁会禁止其他用户的读/写操作。
另外,只有无人进行写操作时,用户才能获得读锁,读锁之间是互不冲突的。
在特定的环境中,表锁可能性能良好。例如,READ LOCAL 表锁支持某种类型的并发写操作。
另外,写锁比读锁有更高的优先级,即使有读操作用户已排在队列中,一个被申请的写锁仍可以排列在锁队列的前列。
虽然存储引擎管理自己的锁,MySQL本身也能使用各种有效的表锁,以用于各种目的。
例如,mysql数据库可以在语句中,如ALTER TABLE语句中,使用写锁,而不用考虑存储引擎。
1)、行级锁(Row Locks)
行级锁可以支持最大的并发处理(同时也带来最大的锁开销)。
支持引擎innodb等。行级锁是由存储引擎实现,而不是由MySQL服务器实现。
服务器完全不了解存储引擎里的锁实现方式。
2)、事务
事务是一组原子性的SQL查询语句,也可以被看做一个工作单元。如果数据库引擎能够成功地数据库应用所有的查询语句,它就会执行所有查询,但是,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都不会执行。也就是说,事务内的语句要么全部执行,要么一句也不执行。
3)、ACID测试
原子性(Atomicity)
一个事务必须被视为一个单独的内部“不可分”的工作单元,以确保整个事务要么全部执行,要么全部回滚。
一致性(Consistency)
隔离性(Isolation)
某个事务的结果只有在完成之后才对其他事务可见。
持久性(Durability)