您的位置:首页 > 数据库 > MySQL

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开销要小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: