lily 2007-8-9 14:13
mysql存储过程学习笔记--事务控制
<p><P>要使<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, 'mysql');" target="_self"><u><strong>mysql</strong></u></a>支持事务,表类型要用: InnoDB</P><P><BR><STRONG><U>1、 隔离级别</U></STRONG></P><P><STRONG><U></U></STRONG><BR><TABLE style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center><TBODY><TR><TD>SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED |REPEATABLE READ | SERIALIZABLE}</TD></TR></TBODY></TABLE><BR>默认为:REPEATABLE READ</P><P>在SQL99中,为了实现事务的完全隔离,定义了三种必须避免的现象: </P><P><BR>1、<U><STRONG>读"脏"数据(dirty read):</STRONG></U>即事务在运行中读到了其它事务未提交的数据。 <BR>2、<STRONG><U>不可重复读(unrepeatable read):</U></STRONG>即事务在运行中再次读取同一数据时,可发现其它事务的更新。 <BR>3、<U><STRONG>"幻象"读(phantom read):</STRONG></U>即事务在运行中再次执行同一查询时,发现其它事务的更新。 </P><P>只有避免上面三种现象,才能实现真正意义上的隔离,或者称是可串行的。但是,此时事务之间因为冲突而等待的机会非常高,系统的性能可能难以达到预期的目标。 为了实现隔离性与系统性能之间的平衡,SQL99定义了四种隔离级别, 允许应用根据实际需要选择合适的隔离级别馑闹指衾爰侗鸬暮迦缦拢?nbsp;</P><P><TABLE style="WIDTH: 468px; HEIGHT: 156px" cellSpacing=1 cellPadding=1 width=468 border=1><TBODY><TR><TD> </TD><TD> <STRONG><U>读"脏"数据</U></STRONG></TD><TD><STRONG><U>不可重复读</U></STRONG> </TD><TD><STRONG><U>"幻象"读</U></STRONG> </TD></TR><TR><TD> <STRONG><U>未提交读READ UNCOMMITTED</U></STRONG></TD><TD> N</TD><TD> N</TD><TD> N</TD></TR><TR><TD> <STRONG><U>提交读READ COMMITTED</U></STRONG> </TD><TD> Y</TD><TD> N</TD><TD> N</TD></TR><TR><TD> <STRONG><U>可重复读REPEATABLE READ</U></STRONG> </TD><TD> Y</TD><TD> Y</TD><TD> N</TD></TR><TR><TD> <STRONG><U>可串行SERIALIZABLE</U></STRONG> </TD><TD> Y</TD><TD> Y</TD><TD> Y</TD></TR></TBODY></TABLE><BR>其中"N"表示在这种隔离级别下,对应的现象不可避免,而"Y"则 表示可以避免。</P><P><STRONG><U>2、 事务语句</U></STRONG></P><STRONG><U></U></STRONG><P><BR><U><STRONG>START TRANSACTION</STRONG></U></P><U></U><P>开始一个事务,如果已存在一个事务,会先立即commit.另外,autocommit属性会被设为0,直到事务结束</P><P><STRONG><U>COMMIT</U></STRONG></P><P>提交所有数据,释放锁</P><P><STRONG><U>ROLLBACK</U></STRONG></P><P>回滚事务</P><P><STRONG><U>SAVEPOINT savepoint_name</U></STRONG></P><P>设点存盘点</P><P><STRONG><U>ROLLBACK TO SAVEPOINT savepoint_name</U></STRONG></P><P>回滚至savepoint_name</P><P><STRONG><U>SET TRANSACTION</U></STRONG></P><P>设置隔离级别(SET TRANSACTION ISOLATION LEVEL)</P><P><STRONG><U>LOCK TABLES</U></STRONG></P><P>锁定表,此操作会导致当前打开的事务立即开关闭,所以应在此之前,执行commit或rollback</P><P><BR><STRONG><U>3、 定义事务</U></STRONG></P><P>要开启事务处理,有如下两个<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%B7%BD%B7%A8');" target="_self"><u><strong>方法</strong></u></a>:<BR>a、 将autocommit设为0<BR>b、 使用START TRANACTION语句(建议使用)</P><P>注:以下语句会导致即时commit当前事务<BR>ALTER FUNCTION ALTER PROCEDURE ALTER TABLE<BR>BEGIN CREATE DATABASE CREATE FUNCTION<BR>CREATE INDEX CREATE PROCEDURE CREATE TABLE<BR>DROP DATABASE DROP FUNCTION DROP INDEX<BR>DROP PROCEDURE DROP TABLE UNLOCK TABLES<BR>LOAD MASTER DATA LOCK TABLES RENAME TABLE<BR>trUNCATE TABLE SET AUTOCOMMIT=1 START TRANSACTION</P></p> <center><input type="image" onclick=copyToClipBoard() src="http://www.phpchina.com/images/phpcn_book_bu_tj.gif" border="0"></center>