⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 06-7.html

📁 MySQL4.1.0 中文参考手册
💻 HTML
字号:
  <HTML>
  <HEAD>
  <TITLE>MySQL 4.1.0 中文参考手册 --- 犬犬(心帆)翻译</TITLE>
   <style> code {color:purple} tt {color:green} samp {color:navy} pre {color:maroon} </style>
   <META http-equiv="Content-Type" content="text/html; charset=gb2312">
   <META name="description" content="MySQL 4.1.0  中文参考手册">
   <META name="keywords" content="MySQL,4.1.0,Shuixin13,MySQL 4.1.0,中文,中文参考手册,犬犬(心帆)">
   <LINK rel="shortcut icon" href="shuixin13.ico" />
   <LINK href="images/index.css" type=text/css rel=STYLESHEET>
<SCRIPT language=javascript src="images/index.js"></SCRIPT>
<SCRIPT language=javascript><!--
x = new Date()  
function cal() {
	y = new Date()   
	diff = y.getTime() - x.getTime()
	document.write("载入时间 " + diff/1000 + " 秒")
}
//--></SCRIPT>
<SCRIPT language=JavaScript>
var currentpos,timer; 
function initialize() 
{ 
timer=setInterval("scrollwindow()",10); 
} 
function sc() 
{ 
clearInterval(timer); 
} 

function scrollwindow() 
{ 
currentpos=document.body.scrollTop; 
window.scroll(0,++currentpos); 
if (currentpos != document.body.scrollTop) 
sc(); 
} 
document.onmousedown=sc 
document.ondblclick=initialize 
</SCRIPT>

  </HEAD>
  <BODY BGCOLOR=#efefff TEXT=#000000 LINK=#101090 VLINK=#7030B0>
<H1>MySQL Reference Manual for version 4.1.0-alpha.</H1>
<P>
<P><HR>
<H2><A NAME="Transactional_Commands"></A>6.7 MySQL 事务与锁定命令</H2>

<H3><A NAME="COMMIT"></A>6.7.1  <CODE>BEGIN/COMMIT/ROLLBACK</CODE> 句法</H3>

<P>
<A NAME="IDX1506"></A>
<A NAME="IDX1507"></A>
<A NAME="IDX1508"></A>
<A NAME="IDX1509"></A>

</P>
<P>
缺省的,MySQL 运行在 <CODE>autocommit</CODE> 模式。这就意味着,当你执行完一个更新时,MySQL 将立刻将更新存储到磁盘上。
</P>

<P>
如果你使用事务安全表 (例如 <CODE>InnoDB</CODE>、<CODE>BDB</CODE>),通过下面的命令,你可以设置 MySQL 为非 <CODE>autocommit</CODE> 模式:
</P>

<PRE>
SET AUTOCOMMIT=0
</PRE>

<P>
在此之后,你必须使用 <CODE>COMMIT</CODE> 来存储你的更改到磁盘上,或者使用 <CODE>ROLLBACK</CODE> ,如果你希望忽略从你的事务开始所做的更改。
</P>

<P>
如果你希望为一系列语句从 <CODE>AUTOCOMMIT</CODE> 模式转换,你可以使用 <CODE>START TRANSACTION</CODE> 或 <CODE>BEGIN</CODE> 或 <CODE>BEGIN WORK</CODE> 语句:
</P>

<PRE>
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;
</PRE>

<P>
<CODE>START TRANSACTION</CODE> 在 MySQL 4.0.11 中被加入;这是被推荐的开始一个特别(ad-hoc)事务的方式,因为这是 ANSI SQL 句法。
</P>

<P>
注意,如果你使用的是一个非事务安全表,更改会立刻被存储,不受 <CODE>autocommit</CODE> 模式状态的约束。
</P>

<P>
当你更新了一个非事务表后,如果你执行一个 <CODE>ROLLBACK</CODE>,你将得到一个错误 (<CODE>ER_WARNING_NOT_COMPLETE_ROLLBACK</CODE>) 作为一个警告。所有事务安全表将被恢复,但是非事务安全表将不会改变。
</P>

<P>
如果你使用 <CODE>START TRANSACTION</CODE> 或 <CODE>SET AUTOCOMMIT=0</CODE>,你应该使用 MySQL 二进制日志做备份以代替老的更新日志。事务处理被以一个大块形式存储在二进制日志中,在 <CODE>COMMIT</CODE> 上面,为了保护回滚的事务,而不是被存储的。查看章节  <A HREF="manual.html1#Binary_log">4.9.4  二进制日志</A>。

如果您使用起动事务处理或集AUTOCOMMIT=0 ,您应该使用MySQL 二进制日志为备份代替更旧的更新日志。 事务处理存储在二进制登录一大块,做,保证, 滚的事务处理不存储。 参见部分4 。9.4 二进制日志。

</P>
<P>
下列命令自动的结束一个事务 (就好像你在执行这个命令之前,做了一个 <CODE>COMMIT</CODE>):
</P>

<TABLE BORDER WIDTH="95%">
<TR><TD><STRONG>命令 </STRONG> </TD><TD> <STRONG>命令 </STRONG> </TD><TD> <STRONG>命令 </STRONG>
</TD></TR>
<TR><TD><CODE>ALTER TABLE</CODE> </TD><TD> <CODE>BEGIN</CODE> </TD><TD> <CODE>CREATE INDEX</CODE>
</TD></TR>
<TR><TD><CODE>DROP DATABASE</CODE> </TD><TD> <CODE>DROP TABLE</CODE> </TD><TD> <CODE>RENAME TABLE</CODE>
</TD></TR>
<TR><TD><CODE>TRUNCATE</CODE> </TD><TD>&nbsp;  </TD><TD>&nbsp;  
</TD></TR>
</TABLE>

<P>
你可以使用 <CODE>SET TRANSACTION ISOLATION LEVEL ...</CODE> 改变事务的隔离级。查看章节 <A HREF="06-7.html#SET_TRANSACTION">6.7.3  <CODE>SET TRANSACTION</CODE> 句法</A>。

</P>



<H3><A NAME="LOCK_TABLES"></A>6.7.2  <CODE>LOCK TABLES/UNLOCK TABLES</CODE> 句法</H3>

<P>
<A NAME="IDX1510"></A>
<A NAME="IDX1511"></A>

</P>

<PRE>
LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
            [, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES
</PRE>

<P>
<CODE>LOCK TABLES</CODE> 为当前线程锁定表。<CODE>UNLOCK TABLES</CODE> 释放当前线程拥有的所有锁定。当线程发出另一个 <CODE>LOCK TABLES</CODE>,或当与服务器的连接被关闭时,被当前线程锁定的所有表将被自动地解锁。
</P>

<P>
为了在 MySQL 4.0.2 使用 <CODE>LOCK TABLES</CODE> ,你必须拥有一个全局的 <CODE>LOCK TABLES</CODE> 权限和一个在相关表上的 <CODE>SELECT</CODE> 权限。在 MySQL 3.23 中,你对该表需要有 <CODE>SELECT</CODE>、<CODE>insert</CODE>、<CODE>DELETE</CODE> 和 <CODE>UPDATE</CODE> 权限。
</P>

<P>
使用 <CODE>LOCK TABLES</CODE> 的主要原因是,仿效事务处理或在更新表时得到更快的速度。此后会有更详细的描述。
</P>

<P>
如果一个线程在一个表上得到一个 <CODE>READ</CODE> 锁,该线程 (和所有其它线程) 只能从表中读取。如果一个线程在一个表上得到一个 <CODE>WRITE</CODE> 锁,那么只有拥有这个锁的线程可以从表中读取和写表。其它的线程被阻塞。
</P>

<P>
<CODE>READ LOCAL</CODE> 和 <CODE>READ</CODE> 之间的不同就在于,当锁被加载时,<CODE>READ LOCAL</CODE> 允许非冲突(non-conflicting) <CODE>INSERT</CODE> 语句执行。如果当你加载着锁时从 MySQL 外部操作数据库文件,这将仍不能被使用。
</P>

<P>
当你使用 <CODE>LOCK TABLES</CODE> 是地,你必须锁定所有你将使用的表,并且必须使用与你的查询中将使用的别名相同!如果你在一个查询中多次使用一个表(用别名),你必须为每一个别名获得一个锁。
</P>

<P>
<CODE>WRITE</CODE> 锁通过比 <CODE>READ</CODE> 锁有更高的权限,以确保更新被尽快地处理。这就意味着,如果一个线程获得一个 <CODE>READ</CODE> 锁,而同时另外一个线程请求一个 <CODE>WRITE</CODE> 锁,并发的 <CODE>READ</CODE> 锁请求将等待直到 
<CODE>WRITE</CODE> 线程得到了锁并释放了它。你可以使用 <CODE>LOW_PRIORITY WRITE</CODE> 锁,当该线程在等待 <CODE>WRITE</CODE> 锁时,它将允许其它的线程获得 <CODE>READ</CODE> 锁。


你应该只使用 <CODE>LOW_PRIORITY WRITE</CODE> 锁,如果你确信这将是最后一次,当没有线程将拥有 <CODE>READ</CODE> 锁。 


</P>
<P>
<CODE>LOCK TABLES</CODE> 工作如下:

<OL>
<LI>
以内部定义的次序排序所有被锁定的表 (从用户立场说,该次序是不明确的)。

<LI>
如果一个表被以一个读锁和一个写锁锁定,将写锁放在读锁之前。

<LI>
一次只锁定一个表,只到线程得到所有的锁定。

</OL>

<P>
这个方案是为了确保,表锁定死锁释放。 对于这个模式你仍然有些其它事情需要知道:
</P>

<P>
如果你对一个表使用一个 <CODE>LOW_PRIORITY WRITE</CODE> 锁定,这就意味着,MySQL 将等待这个锁,直到没有线程请求一个 <CODE>READ</CODE> 锁。当线程得到了 <CODE>WRITE</CODE> 锁,并等待获得锁定表列表中的下一个表的锁定时,其它所有的线程将等待 <CODE>WRITE</CODE> 锁被释放。如果这在你的应用程序中会引起一个严重的问题,你应该考虑将你的某些表转换为事务安全表。
</P>

<P>
你可以使用 <CODE>KILL</CODE> 安全地杀死一个正在表锁定的线程。查看章节 <A HREF="manual1.html#KILL">4.5.5  <CODE>KILL</CODE> 句法</A>。
</P>

<P>
注意,你<STRONG>不应该</STRONG> 锁定你正在对其使用 <CODE>INSERT DELAYED</CODE> 的表。这是因为,在这种情况下,<CODE>INSERT</CODE> 是通过单独的线程完成的。
</P>

<P>
通常,你不需要锁定任何表,因为所有单 <CODE>UPDATE</CODE> 语句都是原子的;其它的线程无法干扰当前执行的 SQL 语句。当你无论如何希望锁定表时,这里有一些情况:
</P>

<UL>
<LI>
如果你在一束表上运行许多操作,锁定你将要使用的表,这会更快一些。当然有不利的方面,其它线程将不能更新一个 <CODE>READ</CODE> 锁的表,并且没有其它线程要以读取一个 <CODE>WRITE</CODE> 锁的表。

在 <CODE>LOCK TABLES</CODE> 下,某些事运行得更快一些的原因是,MySQL 将不会转储清除被锁定表键高速缓冲,直到 <CODE>UNLOCK TABLES</CODE> 被调用 (通常键高速缓冲在每个 SQL 语句后都会被转储清除)。这将加速在 <CODE>MyISAM</CODE> 表上的插入、更新、删除。

<P></P>

<LI>
如果你在 MySQL 中正在使用一个不支持事务的存储引擎,如果你希望能确保没有其它的线程会出现在一个 <CODE>SELECT</CODE> 和 一个 <CODE>UPDATE</CODE> 之间,你必须使用 <CODE>LOCK TABLES</CODE> 。下面的示例显示为了安全地执行,这里需要<CODE>LOCK TABLES</CODE> :

<PRE>
mysql&#62; LOCK TABLES trans READ, customer WRITE;
mysql&#62; SELECT SUM(value) FROM trans WHERE customer_id=some_id;
mysql&#62; UPDATE customer SET total_value=sum_from_previous_statement
    -&#62;        WHERE customer_id=some_id;
mysql&#62; UNLOCK TABLES;
</PRE>

不使用 <CODE>LOCK TABLES</CODE>,将可能发生在 <CODE>SELECT</CODE> 和 <CODE>UPDATE</CODE> 语句执行期间有另外一个线程可能在 <CODE>trans</CODE> 表中插入一行新记录。

</UL>

<P>
通过使用递增更新 (<CODE>UPDATE customer SET value=value+new_value</CODE>) 或 <CODE>LAST_INSERT_ID()</CODE> 函数,你可以在很多情况下避免使用 <CODE>LOCK TABLES</CODE>。
</P>

<P>
你也可以使用用户级锁定函数 <CODE>GET_LOCK()</CODE> 和 <CODE>RELEASE_LOCK()</CODE> 解决一些情况,这些锁被保存在服务器上的一个哈希表中,并以 <CODE>pthread_mutex_lock()</CODE> 和 <CODE>pthread_mutex_unlock()</CODE> 实现以获得高速度。查看章节 <A HREF="06-3.html#Miscellaneous_functions">6.3.6.2  辅助功能函数</A>。
</P>

<P>
查看章节 <A HREF="manual1.html#Internal_locking">5.3.1  MySQL 如何锁定表</A>,以获取关于锁定方案的更多信息。
</P>

<P>
你可以使用 <CODE>FLUSH TABLES WITH READ LOCK</CODE> 命令以读锁锁定所有数据库中的所有表。查看章节 <A HREF="manual1.html#FLUSH">4.5.3  <CODE>FLUSH</CODE> 句法</A>。如果你有一个可以及时建立文件快照的文件系统,例如 Veritas,这将是得到备份的非常方便方式。
</P>

<P>
<STRONG>注意:</STRONG><CODE>LOCK TABLES</CODE> 不是事务安全的,在尝试锁定一个表之前,将自动地提交所有的活动事务。
</P>



<H3><A NAME="SET_TRANSACTION"></A>6.7.3  <CODE>SET TRANSACTION</CODE> 句法</H3>

<P>
<A NAME="IDX1512"></A>
<A NAME="IDX1513"></A>

</P>

<PRE>
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
</PRE>

<P>
设置全局的、整个会话或下一个事务的事务隔离级。
</P>

<P>
缺省行为是设置下一个(未启动的)事务的隔离级。如果你使用 <CODE>GLOBAL</CODE> 关键词,语句为所有在那个点上建立的新连接设置默认的全局事务隔离级。为了这样做,你需要有 <CODE>SUPER</CODE> 权限。使用 <CODE>SESSION</CODE> 关键词为当前连接所有将来执行的事务设置默认的事务隔离级。
</P>

<P>
你可以使用 <CODE>--transaction-isolation=...</CODE> 为 <CODE>mysqld</CODE> 设置默认的全局隔离级。查看章节 <A HREF="manual1.html#Command-line_options">4.1.1  <CODE>mysqld</CODE>  命令行选项</A>。
</P>


<H2>&nbsp;</H2>

</BODY>
 </HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -