InnoDB中文参考手册---8InnoDB事务模式与锁定

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
InnoDB 中文参考手册---犬犬(心帆)翻译8 InnoDB 事务模式锁定
InnoDB事务处理模式中,thegoalhasbeentocombinethebestpropertiesofamultiversioningdatabasetotraditionaltwo-phaselocking. InnoDB进行行级的 锁定,并以与非 锁定读取(non-locking)类似的方式读取数据。 InnoDB中的 锁定表的存储是如此(space-efficiently)而不再需要扩大 锁定:典型特色是一些用户可能 锁定中的任意行或任意行的子集,而不会引起 InnoDB内存运行溢出。

InnoDB中,所有的用户操作均是以事务方式处理的。如果使用了自动提交(autocommit)方式,每个SQL语句将以一个单独的事务来处理。MySQL通常是以自动提交方式建立一个服务连接的。

如果使用SETAUTOCOMMIT=0关闭自动提交模式,就认为用户总是以事务方式操作。如果发出一个COMMIT或ROLLBACK的SQL语句,它将停止当前的事务而重新开始新事务。两个语句将会释放所有在当前事务中设置的 InnoDB 锁定。COMMIT意味着永久改变在当前事务中的更改并为其它用户可见。ROLLBACK正好相反,它是取消当前事务的所有更改。

如果以AUTOCOMMIT=1建立一个连接,那么用户仍然可以通过以BEGIN开始和COMMIT或ROLLBACK为语句结束的方式来执行一个多语句的事务处理。

在SQL-1992事务隔离级(transactionisolationlevels)规定的条款中, InnoDB默认为REPEATABLEREAD。从4.0.5开始, InnoDB提供了SQL-1992标准中所有的4个不同的事务隔离级。你可以my.cnf的[mysqld]区中设置所有连接的默认事务隔离级:
transaction-isolation={READ-UNCOMMITTED|READ-COMMITTED|REPEATABLE-READ|SERIALIZABLE}

 

用户也可以通过下面的SQL语句为单个连接或所有新建的连接改变隔离级:
SET[SESSION|GLOBAL]TRANSACTIONISOLATIONLEVEL{READUNCOMMITTED|READCOMMITTED|REPEATABLEREAD|SERIALIZABLE}
注意在这个SQL语句的语法中没有连字符。如果你在上述语句中详细指定关键字GLOBAL,它将决定新建连接的初始隔离级,但不会改变已有连接的隔离级。任何用户均可以更改自身会话的隔离级,即使是在一个事务处理过程中。在3.23.50以前的版本中SETTRANSACTION对 InnoDB表无任何效果。在4.0.5以前的版本中只有REPEATABLEREAD和SERIALIZABLE可用。
 

可以通过下列语句查询全局和当前会话的事务隔离级:
SELECT@@global.tx_isolation;SELECT@@tx_isolation;

 

InnoDB的行锁中使用所谓的next-keylocking。这就意味着,除了索引记录外, InnoDB还可以 锁定该索引记录前部“间隙”('gap')以阻塞其它用户在索引记录前部的直接插入。next-keylock意思是 锁定一个索引记录以及该记录之前的间隙(gap)。gaplock就是只 锁定某些索引记录之前的间隙。

InnoDB中的隔离级详细描述:READUNCOMMITTED这通常称为'dirtyread':non-lockingSELECTs的执行使我们不会看到一个记录的可能更早的版本;因而在这个隔离度下是非'consistent'reads;另外,这级隔离的运作如同READCOMMITTED。READCOMMITTED有些类似Oracle的隔离级。所有SELECT...FORUPDATE和SELECT...LOCKINSHAREMODE语句只 锁定索引记录,而不 锁定之前的间隙,因而允许在 锁定的记录后自由地插入新记录。以一个唯一地搜索条件使用一个唯一索引(uniqueindex)的UPDATE和DELETE,仅仅只 锁定所找到的索引记录,而不 锁定该索引之前的间隙。但是在范围型的UPDATEandDELETE中, InnoDB必须设置next-key或gaplocks来阻塞其它用户对范围内的空隙插入。自从为了MySQL进行复制(replication)与恢复(recovery)工作'phantomrows'必须被阻塞以来,这就是必须的了。Consistentreads运作方式与Oracle有点类似:每一个consistentread,甚至是同一个事务中的,均设置并作用它自己的最新快照。REPEATABLEREAD这是 InnoDB默认的事务隔离级。.SELECT...FORUPDATE,SELECT...LOCKINSHAREMODE,UPDATE,和DELETE,这些以唯一条件搜索唯一索引的,只 锁定所找到的索引记录,而不 锁定该索引之前的间隙。否则这些操作将使用next-key 锁定,以next-key和gaplocks 锁定找到的索引范围,并阻塞其它用户的新建插入。在consistentreads中,与前一个隔离级相比这是一个重要的差别:在这一级中,同一事务中所有的consistentreads均读取第一次读取时已确定的快照。这个约定就意味着如果在同一事务中发出几个无格式(plain)的SELECTs,这些SELECTs的相互关系是一致的。SERIALIZABLE这一级与上一级相似,只是无格式(plain)的SELECTs被隐含地转换为SELECT...LOCKINSHAREMODE。 1 <script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值