MySQL读书笔记-事务日志,MySQL中的事务

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 TABLESUNLOCK TABLES语句,这是在服务器层实现的,和存储引擎无关。它们有自己的用途,但并不能代替事务处理,如果应用需要用到事务,还是应该选择事务型存储引擎。

思考:InnoDB的行级锁比MyISAM中使用LOCK TABLES开销要小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值