死锁
指两个或多个事务在统一资源上相互占用,并请求锁定对方资源时,从而导致的恶性循环现象。
(当两个事务同时执行了一条修改语句,更新了一条数据,同时也锁定了该行数据,接着每个事务去执行第二个修改语句时,发现该行数据已经被对方锁定,然后两个事务同时等待对方释放锁,又同时持有对方的锁,则陷入死循环,除非有外部因素介入,才可以解除死锁。)
事务日志
事务日志可以提高事务的效率。使用事务日志,存储引擎在修改表的数据时,只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,不用每次都将修改的数据本身持久到磁盘。事务日志采用追加的方式。(预写式日志)事务日志持久以后,内存中被修改的数据可以慢慢刷回磁盘。
如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写会磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分数据。
MySQL中的事务
MySQL提供了两种事务型存储引擎
1.InnoDB
2.NDB Cluster
自动提交
MySQL默认采用自动提交模式。如果不是显式的开始一个事务,则每个查询都被当做一个事务执行提交操作。
表分为事务型表和非事务型表。例如(InnoDB和MyISAM表)
MySQL的服务层不管理事务,存储引擎管理事务。所以在同一个事务中,无法使用多种存储引擎。
如果在事务中使用混合使用事务型和非事务型表,正常情况下不会出现什么问题,但是当事务需要回滚时,非事务型表数据修改之后,无法进行回滚。
非事务型表,在执行事务操作时,MySQL通常不会做出提醒,只有在发生回滚时才会做出警告。
InnoDB
1.隐式锁定
InnoDB采用两阶段锁定协议,在事务的执行过程中,随时都可以执行锁定,锁只有在提交和回滚时才会释放,并且所有的锁都是在同一时间被释放。InnoDB会根据隔离级别在需要的时候自动加锁。
2.显式锁定
InnoDB也支持通过特定的语句进行显式锁定。
MySQL也支持LOCK TABLES(锁定表) UNLOCK TABLES(解锁表),但是并不能代替事务。
网友评论