一.
1 每个 客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者cpu中运行.服务器会负责缓存线程,因此不需要为每一个新建的连接创建或销毁线程.
对于select语句,在解析查询之前,服务器会先检查查询缓存,如果能在其中找到对应的查询,服务器则不再执行查询解析,优化和执行的整个过程,而直接返回查询缓存中的结果.
对数据的并发处理:
共享锁和排他锁,也叫读锁或写锁.
读锁是共享的,相互不阻塞的.多个客户在同一时刻可以同时读取同一个资源,而互不干扰.
写锁是排他的,会阻塞其他的写锁或读锁.只有这样,才能保证同一时刻只有一个用户能执行写,并防止其他用户读取正在写入的同一资源
锁粒度
加锁也需要消耗资源,包括获得锁,检查锁是否解除,释放锁.
一般都是表上施加行级锁(row level lock)
两种锁策略:
表锁:锁定整张表,阻塞其他用户对该表的所有读写操作.
行级锁:
最大程度的支持并发处理,(但因为每行都可能有锁的操作,锁的开销最大).InnoDB实现了行级锁.行级锁只在存储引擎层实现,而服务器层没有实现.
事务
隔离级别
未提交读:事务中的修改,在事务未提交前,其他事务也是可见的,这种情况叫脏读.在实际中很少使用.
提交读:大多数数据库都是这种隔离级别的(mysql不是).提交事务前,其他事务不能看到修改的数据
可重复读:mysql的默认隔离级别.
死锁:
InnoDB处理死锁:将持有 最少行级排他锁的事务进行回滚,
mysql中的事务: