时间:2020年5月7日 11:28:19
主题:高性能MySQL第三版,读书笔记
本书主要针对MySQL展开详述,内容却精简大方
事务
隔离级别
- (REPEATABLE READ( 可 重复 读))MySQL默认
- Mysql可以通过执行SET TRANSACTION isolation LEVEL 设置隔离级别,级别从下个事务开始的时候生效, 可以配置文件中设置整个数据库的隔离级别,也可以只改变当前会话的隔离级别。
mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
混合引擎
MySQL服务器不管理事务,事务由下层存储引擎实现,所以同一事务使用多个引擎,不可靠!
事务中混合使用了事务型和非事务型的表,正常提交不会有问题,但事务需要回滚,非事务型的表上的变更就无法撤销,这会导致数据库不一致,事务的最终结果无法确定,所以为每张表选择合适的存储引擎非常重要。
须知!!!!
在非事务的表上执行事务相关操作,MySQL通常不会报错和提醒,有时候只有滚回的时候发出警告,非事务型的表不能回滚! 大多数情况下,都不会有任何提示!
隐式和显式锁定
显式锁定不属于SQL规范,不建议使用,和存储引擎无关,是服务层实现的,他们有自己的用处,不能替代事务处理,
SELECT ... LOCK IN SHARE MODE
SELECT ... FOR UPDATE
CSDN,MYSQL锁::blog.csdn.net/zcl_love_wx…
除了事务中禁用了AUTOCOMMIT,可以使用LOCKTABLES之外, 其他 任何时候都不该用
多版本并发控制(MVCC)
MySQL的大多数事务性存储引擎实现的都不是简单的行级锁(典型的有乐观锁和悲观锁),而是MCCC,可以认为是行级锁的变种,为了提供并发性能,非阻塞的读操作,和写操作只锁定必要的行。
简易版本的MVCC
{
给每行记录后增加两个隐藏的列,分创建时间和保存行的过期时间(删除时间),存储的也不是时间,而是系统版本号(System version number),每开始一个新的事务,系统版本号自动递增,事务开始时刻的系统版本号或作为事务的版本号,以做比对。
repeated Read隔离级别下:
select
a. InnoDB只查找版本早于当前事务版本的数据行(行( 也就是, 行的 系统 版本 号 小于 或 等于 事务 的 系统 版 本号),这样可以确保事务读取的行,要么在事务开始前已存在或者事务自身插入或者修改过的。
b. 行的删除版本要么未定义,要么大于当前事务版本号,确保事务读取到的行,在事务开始之前没被删除
附和这两个条件,才作为查询结果返回
INSERT
InnoDB为新插入的每一行保存当前系统版本号作为行版本号
DELETE
InnoDB为删除的每一行保存当前系统版本号作为行删除标识
UPDATE
InnoDB为新插入的每一行保存当前系统版本号作为行版本号,同时保存当前系统版本号作为行删除标识
用额外的存储空间保存这两个系统版本号,可以实现性能不错和读操作简单的事务逻辑。
}
需要知道:
MVCC只在REPEATABLE READ和READ COMMITED 这两个隔离级别下工作,
因为
READ COMMITTED 总读取最新的数据行,而不是附和当前事务版本的数据行,
SERIALIZABLE对所有读取的行都加锁。
mysql> show table status like 'tb_asset';
Name: user Engine: MyISAM Row_ format: Dynamic Rows: 6 Avg_ row_ length: 59 Data_ length: 356 Max_ data_ length: 4294967295 Index_ length: 2048 Data_ free: 0 Auto_ increment: NULL Create_ time: 2002- 01- 24 18: 07: 17 Update_ time: 2002- 01- 24 21: 56: 29 Check_ time: NULL Collation: utf8_ bin Checksum: NULL Create_ options: Comment: Users and global
