共计 1413 个字符,预计需要花费 4 分钟才能阅读完成。
事务:事务就是一组原子性的 SQL 查问,或者说一个独立的工作单元。也就是说,事务内的语句,要么全副执行胜利,要么全副执行失败。
事务的特色:
A(atomicity)原子性
C(consistency)一致性
I(isolation)隔离性
D(durability)持久性
四种隔离级别
READ UNCOMMITTED (未提交读) 在 READ UNCOMMITTED 级别,事务中的批改,即便没有提交,对其余事务也都是可见的。事务能够读取未提交的数据,这也被称为脏读(Dirty Read)。这个级别会导致很多问题,从性能上来说,READ UNCOMMITTED 不会比其余的级别好太多,但却不足其余级别的很多益处,除非真的有十分必要的理由,在理论利用中一 - 般很少应用。
READ COMMITTED (提交读) 大多数数据库系统的默认隔离级别都是 READ COMMITTED (但 MySQL 不是)。READ COMMITTED 满足后面提到的隔离性的简略定义: 一个事务开始时,只能“看见”曾经提交的事务所做的批改。换句话说,一个事务从开始直到提交之前,所做的任何批改对其余事务都是不可见的。这个级别有时候也叫做不可反复读(nonrepeatableread),因为两次执行同样的查问,可能会失去不一样的后果。
REPEATABLE READ (可反复读) REPEATABLE READ 解决了脏读的问题。该级别保障了 在同一个事务中屡次读取同样记录的后果是统一的 。然而实践上,可反复读隔离级别还是无奈解决另外一个幻读(Phantom Read) 的问题。所谓幻读,指的是当某个事务在读取某个范畴内的记录时, 另外一个事务又在该范畴内插入了新的记录,当之前的事务再次读取该范畴的记录时,会产生幻行 (Phantom Row)。InnoDB 和 XtraDB 存储引擎通过多版本并发管制(MVCC, Multiversion Concurrency Control) 解决了幻读的问题。本章稍后会做进一步的探讨。可反复读是 MySQL 的默认事务隔离级别。
SERIALIZABLE (可串行化) SERIALIZABLE 是最高的隔离级别。它通过强制事务串行执行,防止了后面说的幻读的问题。简略来说,SERIALIZABLE 会在读取的每 - 行数据上都加锁,所以可能导致大量的超时和锁争用的问题。理论利用中也很少用到这个隔离级别,只有在十分须要确保数据的一致性而且能够承受没有并发的状况下,才思考采纳该级别。
死锁:是指两个或多个事务再同一资源上互相占用,并申请锁定对方占用的资源,从而导致恶性循环的景象。当多个事务尝试以不同的程序锁定资源时,就可能产生死锁。
事务日志:
应用事务日志,存储引擎再批改表的数据时只须要批改其内存拷贝,再把该批改行为记录到长久在硬盘上的事务日志种,而不必每次都将批改的数据自身长久到磁盘。
应用的是追加的形式,因而写日志的操作是磁盘上一小块区域内的程序 I /O,而不像随机 I / O 须要在磁盘的多个中央挪动磁头,所以采纳事务日志的形式相对来说要快得多。事务日志长久当前,内存中被批改的数据在后盾能够缓缓地刷回到磁盘。目前大多数存储引擎都是这样实现的,咱们通常称之,为预写式日志(Write-Ahead Logging), 批改数据须要写两次磁盘。如果数据的批改曾经记录到事务日志并长久化,但数据自身还没有写回磁盘,此时零碎解体,存储引擎在重启时可能主动复原这部分批改的数据。具体的复原形式则视存储引擎而定。