MySQL读书笔记-事务日志,MySQL中的事务
2016-07-13 23:42
513 查看
WLA(Write-Ahead Logging)
事务日志,可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时,只需要修改其内存拷贝,再把该修改行为记录到硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用的是追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不是随机I/O,所以快很多。事务日志持久以后,内存中被修改的数据在后台可以慢慢地刷回到磁盘。此方式称之为,预写式日志,修改数据需要写两次磁盘。如果数据的修改已经纪录到事务日志中,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时,能够自动恢复这部分修改的数据(具体恢复方式则视存储引擎而定)。
MySQL中的事务
MySQL提供了两种事务存储引擎:InnoDB和NDB Cluster。另外还有一些第三方的存储引擎(例如,XtraDB)也支持事务。自动提交(AUTOCOMMIT)
MySQL默认采用自动提交模式。即,如果不是显示地开始一个事务,则每个查询都被当作一个事务执行提交操作。在当前连接中,可以通过设置AUTOCOMMIT变量来启用或禁用自动提交模式。1或者ON表示启用,0或者OFF表示禁用。
(1)当
AUTOCOMMIT=0时,所有的查询都是在一个事务中,直到显示地执行
COMMIT,或者
ROLLBACK时,该事务结束。
(2)修改AUTOCOMMIT对非事务型的表(例如,MyISAM),不会有任何影响,相当于一直处于AUTOCOMMIT启用的模式。
(3)一些命令,在执行前会强制执行COMMIT提交当前的事务。例如,使用DDL(数据定义语言)。
(4)MySQL可以通过执行
SET TRANSACTION ISOLATION LEVEL命令来设置隔离级别,新的隔离级别会在下一个事务开始时生效。
# 查看AUTOCOMMIT状态和启用 SHOW VARIABLES LIKE 'AUTOCOMMIT'; SET AUTOCOMMIT = 1; # 设置下一个会话的隔离级别为READ COMMITED SET TRANSACTION ISOLATION LEVEL READ COMMITED;
在事务中混合使用存储引擎
MySQL服务器层不管理事务,事务是由下层的存储引擎实现的。所以,在同一个事务中,使用多种存储引擎是不可靠的。
(1)为每张表选择合适的存储引擎非常重要。
(2)在非事务型表上执行事务相关操作,MySQL通常不会发出提醒,也不会报错(即,大多数情况下,对非事务型表的操作都不会有提示)。
隐式和显式锁定
InnoDB采用的是两阶段锁定协议(two-phase locking protocol)。
隐式锁定,InnoDB会根据隔离级别在需要的时候自动加锁,并在执行COMMIT或ROLLBACK时释放。
显式锁定,InnoDB也支持通过特定的语句进行显式锁定,这些语句不属于SQL规范。
SELECT ... LOCK IN SHARE MODE; SELECT ... FOR UPDATE;
MySQL也支持
LOCK TABLES和
UNLOCK TABLES语句,这是在服务器层实现的,和存储引擎无关。它们有自己的用途,但并不能代替事务处理,如果应用需要用到事务,还是应该选择事务型存储引擎。
思考:InnoDB的行级锁比MyISAM中使用LOCK TABLES开销要小。
相关文章推荐
- 从MySQL导出到PostgreSQL
- mysql优化--博森瑞
- MySQL索引原理及慢查询优化
- MySQL 5.7 双主复制+keepalived,常规业务一般够用了
- MySQL 随机取数据效率问题
- MySQL常用函数及注意(ing)
- MySQL中文乱码修改
- mysql中用int来表示时间
- 采用MySQL_upgrade升级授权表方式升级
- 升级MySQL 5.7版本遇到的一些小问题(转)
- 知数堂MySQL DBA在线培训第八期招生中
- 知数堂培训在线免费分享《MySQL 5.7 Replication新特性》
- MySQL5.7绿色版安装
- mysql 常用函数(二)
- Lost connection to MySQL server at ‘reading initial communication packet', system error: 0
- 从mysql中取出TimeStamp格式转换
- mysql 5.6.30
- mysql -- 一些最近看到的写的很好的博客 以及自己的总结
- mysql索引详解
- MySQL技术内幕InnoDB存储引擎学习笔记(第一章)