【高性能Mysql】读书笔记

来源:互联网 发布:mac 虚拟机 win10 编辑:程序博客网 时间:2024/05/16 05:41

读写锁

读写锁是为了保证数据的一致性
读锁(共享锁)
写锁(排他锁)
锁粒度:一种提高共享资源并发性的方式是让锁对象有选择性,只要锁定会修改的数据,锁定的数据量越小并发性越大。Mysql不同存储引擎的都可以实现自己的锁策略和锁粒度。
表锁:对表进行写操作(insert,update,delete)时需要先获得写锁,这样会阻塞其他用户对该表的读写操作。只有没有写锁时,才能对表进行读操作。alter table就是使用的表锁,而忽略存储引擎自己方式实现的锁。
行锁:最大成都实现并发操作,同时带来巨大的锁消耗。(InnoDB,XtraDB)

事务

事务就是一组原子性的Sql查询
语法:

START TRANSACTION;sql...COMMIT;

事务的4大特性ACID
原子性:最小单位
一致性:所有sql成功之后才会commit
隔离性:未执行完事务对其他事务是不可见的
持久性:commit成功就是保存到数据库

隔离级别

SQL标准中定义了4种隔离级别,较低级别的隔离通常可以执行更高的并发,系统的开销也更低。

READ UNCOMMITTED:脏读,不可重复读,幻读
READ COMMITTED:不可重复读,幻读
REPEATABLE READ:幻读
SERIALIZABLE(可串行化):加锁读

死锁

死锁是指二个或多个事务对同意资源上相互占用,并请求锁定对方占用的资源,导致的恶性循环现象。
数据库系统实现了各种死锁检测和死锁超时机制,越复杂的系统越能检测到死锁的循环依赖,并立即返回一个错误。虽然有效,但会导致非常慢的查询。InnoDB目前处理死锁的方法是,将持有最少行级锁的事务进行回滚。
死锁产生的原因:数据冲突,存储引擎实现的方式导致。

Mysql中的事务

自动提交(AUTOCOMMIT):每一个sql默认就是一个事务
show VARIABLES like ‘AUTOCOMMIT’
ON代表启用

在事务中混合使用事务型和非事务型的表(如InnoDB和MyISAM),会导致MyISAM表无法回滚。