标签:linux运维
Linux运维 第四阶段 (四)MySQL锁、事务
1、相关概念:
连接管理器:接受请求、建立安全连接、认证用户等;
线程管理器:线程池,线程重用thread-reuse;
解析器:解析树;
缓存:复杂性、算法、权限等;
>SELECT CURRENT_TIME(); (此命令不缓存)
并发控制问题:两个以上用户同时读写同一个文件数据,多版本并发控制MVCC,时间快照;
锁(最简单的并发控制机制):读锁(共享锁);写锁(独占锁、排他锁);
>HELP LOCK
>LOCK TABLES tb_name [READ|WRITE];
>UNLOCK;
锁粒度划分:从大到小依次,表锁(锁定整张表)、页锁(数据块,一块有多行)、行锁,mysql只支持表锁,行锁需要由存储引擎完成;锁越粗糙越容易管理,锁越精细越能实现并发性,相对内部越复杂。
注:若同时有多个用户写一张表,锁操作会在mysql内部自动完成,我们不需要加锁;在实现数据库的温备份时才需要加锁操作。
2、事务transaction
ACID(Atomicity;Consistency;Isolation;Durability):
Atomicity原子性:事务所引起的DB操作要么都完成,要么都不执行;
Consistency一致性:当事务执行结束之后,整个server状态没有改变,事务前的总和和事务后的总和是一致的(前提在隔离状态下执行),如:银行帐户A(3000)——》B(2000);
Isolation隔离性:事务调度(事务之间影响最小),MVCC(多版本并发控制);
Durability持久性:一旦事务成功完成,系统必须保证任何故障都不会引起事务表现出不一致性。
隔离级别有四种,从低到高依次为:
READ UNCOMMITTED读未提交;
READ COMMITTED读提交;
REPEATABLE READ可重读;(mysql默认)
SERIALIZABLE可串行。
>SHOW GLOBAL VARIABLES LIKE ‘tx_isolation’;
>SELECT @@tx_isolation; (两种方法查看隔离级别)
>SET GLOBAL|SESSION tx_isolation=’READ-UNCOMMITTED’; (修改隔离级别)
注:隔离级别越低,各事务间干扰大,但并发能力强;隔离级别越高,并发能力越弱,但安全性越好。隔离级别调低,可提高性能。
增删改查首先在内存中完成,再写到事务日志中,过段时间才同步到数据文件中(磁盘空间),所以在事务引擎上每次写操作都要执行两遍,一次从内存到事务日志中(速度快,仅记录操作过程),一次是事务日志写入数据文件中(持久)。
内存――》事务日志(撤销);事务日志――》磁盘(同步)
保证ACID的兼容性:redo log(重做日志);undo log(撤销日志)。
日志组:日志文件至关重要,并不是越大越好,根据事务需求。启动mysql时会同步事务日志到磁盘,不能终止,否则 mysql可能会崩溃。
事务日志尽量拿出来放另一磁盘。
>START TRANSACTION; (启动事务)
>多条SQL语句执行,例:>INSERT INTO tb_name......; (事务中的SQL语句是整体,要么都执行,要么都不执行)
>COMMIT;或>ROLLBACK; (事务一旦提交就不能再撤了)
>SELECT @@autocommit; (如没明确启动事务,autocommit能实现自动提交,每一个操作都直接提交,建议明确使用事务>START TRANSACTION;并关闭自动提交,系统性能要高的话,IO操作越少越好)
>SET GLOBAL autocommit=0; (关闭自动提交,永久生效可写入配置文件)
>HELP SAVEPOINT (保存点,>SAVEPOINT sp_name;)
>START TRANSACTION;
>DELETE FROM tutors WHERE Age<25;
>SAVEPOINT ab; (保存点名称不能使用数字)
>INSERT INTO tutors (Tname,Gender,Age) VALUES (‘jowin’,’M’,25);
>SAVEPOINT ac;
>ROLLBACK TO ab; (回滚至之前的保存点)
>COMMIT;
多事务同时执行(彼此之间互相不影响的方式并发,可提高吞吐量和资源利用率,并减少等待时间),事务之间的交互通过数据集。
并发控制所依赖的技术手段:锁(饿死-锁饥饿,要锁但申请不到;死锁)、时间戳、多版本控制和快照隔离。
事务的状态:活动的;部分提交的;提交的;失败的;中止的。
事务调度:可恢复调度;无级联调度。
查看事务隔离级别对事务的影响:在两个终端上进行
>SELECT @@tx_isolation;
>SET tx_isolation=’READ-UNCOMMITTED’; (在一终端上来回切换隔离级别)
>UPDATE tb_name SET.....;
>ROLLBACK;
>COMMIT;
>SELECT * FROM tb_name; (在另一终端查看)
本篇是学习《马哥网络视频》做的笔记。
本文出自 “Linux运维重难点学习笔记” 博客,谢绝转载!
标签:linux运维
原文地址:http://jowin.blog.51cto.com/10090021/1683317