国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL 4.1.0 中文參考手冊 --- 6.7 MySQL 事務與鎖定命令

2024-07-24 12:54:51
字體:
來源:轉載
供稿:網友
mysql 4.1.0 中文參考手冊 --- 犬犬(心帆)翻譯 mysql reference manual for version 4.1.0-alpha.

6.7 mysql 事務與鎖定命令6.7.1 begin/commit/rollback 句法


缺省的,mysql 運行在 autocommit 模式。這就意味著,當你執(zhí)行完一個更新時,mysql 將立刻將更新存儲到磁盤上。

如果你使用事務安全表 (例如 innodb、bdb),通過下面的命令,你可以設置 mysql 為非 autocommit 模式:

set autocommit=0

在此之后,你必須使用 commit 來存儲你的更改到磁盤上,或者使用 rollback ,如果你希望忽略從你的事務開始所做的更改。

如果你希望為一系列語句從 autocommit 模式轉換,你可以使用 start transaction 或 begin 或 begin work 語句:

start transaction;select @a:=sum(salary) from table1 where type=1;update table2 set [email protected] where type=1;commit;

start transaction 在 mysql 4.0.11 中被加入;這是被推薦的開始一個特別(ad-hoc)事務的方式,因為這是 ansi sql 句法。

注意,如果你使用的是一個非事務安全表,更改會立刻被存儲,不受 autocommit 模式狀態(tài)的約束。

當你更新了一個非事務表后,如果你執(zhí)行一個 rollback,你將得到一個錯誤 (er_warning_not_complete_rollback) 作為一個警告。所有事務安全表將被恢復,但是非事務安全表將不會改變。

如果你使用 start transaction 或 set autocommit=0,你應該使用 mysql 二進制日志做備份以代替老的更新日志。事務處理被以一個大塊形式存儲在二進制日志中,在 commit 上面,為了保護回滾的事務,而不是被存儲的。查看章節(jié) 4.9.4 二進制日志。如果您使用起動事務處理或集autocommit=0 ,您應該使用mysql 二進制日志為備份代替更舊的更新日志。 事務處理存儲在二進制登錄一大塊,做,保證, 滾的事務處理不存儲。 參見部分4 。9.4 二進制日志。

下列命令自動的結束一個事務 (就好像你在執(zhí)行這個命令之前,做了一個 commit):
命令 命令 命令 alter table begin create indexdrop database drop table rename tabletruncate    
你可以使用 set transaction isolation level ... 改變事務的隔離級。查看章節(jié) 6.7.3 set transaction 句法。
6.7.2 lock tables/unlock tables 句法


lock tables tbl_name [as alias] {read [local] | [low_priority] write} [, tbl_name [as alias] {read [local] | [low_priority] write} ...]...unlock tables

lock tables 為當前線程鎖定表。unlock tables 釋放當前線程擁有的所有鎖定。當線程發(fā)出另一個 lock tables,或當與服務器的連接被關閉時,被當前線程鎖定的所有表將被自動地解鎖。

為了在 mysql 4.0.2 使用 lock tables ,你必須擁有一個全局的 lock tables 權限和一個在相關表上的 select 權限。在 mysql 3.23 中,你對該表需要有 select、insert、delete 和 update 權限。

使用 lock tables 的主要原因是,仿效事務處理或在更新表時得到更快的速度。此后會有更詳細的描述。

如果一個線程在一個表上得到一個 read 鎖,該線程 (和所有其它線程) 只能從表中讀取。如果一個線程在一個表上得到一個 write 鎖,那么只有擁有這個鎖的線程可以從表中讀取和寫表。其它的線程被阻塞。

read local 和 read 之間的不同就在于,當鎖被加載時,read local 允許非沖突(non-conflicting) insert 語句執(zhí)行。如果當你加載著鎖時從 mysql 外部操作數據庫文件,這將仍不能被使用。

當你使用 lock tables 是地,你必須鎖定所有你將使用的表,并且必須使用與你的查詢中將使用的別名相同!如果你在一個查詢中多次使用一個表(用別名),你必須為每一個別名獲得一個鎖。

write 鎖通過比 read 鎖有更高的權限,以確保更新被盡快地處理。這就意味著,如果一個線程獲得一個 read 鎖,而同時另外一個線程請求一個 write 鎖,并發(fā)的 read 鎖請求將等待直到 write 線程得到了鎖并釋放了它。你可以使用 low_priority write 鎖,當該線程在等待 write 鎖時,它將允許其它的線程獲得 read 鎖。你應該只使用 low_priority write 鎖,如果你確信這將是最后一次,當沒有線程將擁有 read 鎖。

lock tables 工作如下:以內部定義的次序排序所有被鎖定的表 (從用戶立場說,該次序是不明確的)。如果一個表被以一個讀鎖和一個寫鎖鎖定,將寫鎖放在讀鎖之前。一次只鎖定一個表,只到線程得到所有的鎖定。
這個方案是為了確保,表鎖定死鎖釋放。 對于這個模式你仍然有些其它事情需要知道:

如果你對一個表使用一個 low_priority write 鎖定,這就意味著,mysql 將等待這個鎖,直到沒有線程請求一個 read 鎖。當線程得到了 write 鎖,并等待獲得鎖定表列表中的下一個表的鎖定時,其它所有的線程將等待 write 鎖被釋放。如果這在你的應用程序中會引起一個嚴重的問題,你應該考慮將你的某些表轉換為事務安全表。

你可以使用 kill 安全地殺死一個正在表鎖定的線程。查看章節(jié) 4.5.5 kill 句法。

注意,你不應該 鎖定你正在對其使用 insert delayed 的表。這是因為,在這種情況下,insert 是通過單獨的線程完成的。

通常,你不需要鎖定任何表,因為所有單 update 語句都是原子的;其它的線程無法干擾當前執(zhí)行的 sql 語句。當你無論如何希望鎖定表時,這里有一些情況:
如果你在一束表上運行許多操作,鎖定你將要使用的表,這會更快一些。當然有不利的方面,其它線程將不能更新一個 read 鎖的表,并且沒有其它線程要以讀取一個 write 鎖的表。在 lock tables 下,某些事運行得更快一些的原因是,mysql 將不會轉儲清除被鎖定表鍵高速緩沖,直到 unlock tables 被調用 (通常鍵高速緩沖在每個 sql 語句后都會被轉儲清除)。這將加速在 myisam 表上的插入、更新、刪除。

如果你在 mysql 中正在使用一個不支持事務的存儲引擎,如果你希望能確保沒有其它的線程會出現在一個 select 和 一個 update 之間,你必須使用 lock tables 。下面的示例顯示為了安全地執(zhí)行,這里需要lock tables :
mysql> lock tables trans read, customer write;mysql> select sum(value) from trans where customer_id=some_id;mysql> update customer set total_value=sum_from_previous_statement -> where customer_id=some_id;mysql> unlock tables;
不使用 lock tables,將可能發(fā)生在 select 和 update 語句執(zhí)行期間有另外一個線程可能在 trans 表中插入一行新記錄。
通過使用遞增更新 (update customer set value=value+new_value) 或 last_insert_id() 函數,你可以在很多情況下避免使用 lock tables。

你也可以使用用戶級鎖定函數 get_lock() 和 release_lock() 解決一些情況,這些鎖被保存在服務器上的一個哈希表中,并以 pthread_mutex_lock() 和 pthread_mutex_unlock() 實現以獲得高速度。查看章節(jié) 6.3.6.2 輔助功能函數。

查看章節(jié) 5.3.1 mysql 如何鎖定表,以獲取關于鎖定方案的更多信息。

你可以使用 flush tables with read lock 命令以讀鎖鎖定所有數據庫中的所有表。查看章節(jié) 4.5.3 flush 句法。如果你有一個可以及時建立文件快照的文件系統,例如 veritas,這將是得到備份的非常方便方式。

注意:lock tables 不是事務安全的,在嘗試鎖定一個表之前,將自動地提交所有的活動事務。
6.7.3 set transaction 句法


set [global | session] transaction isolation level{ read uncommitted | read committed | repeatable read | serializable }

設置全局的、整個會話或下一個事務的事務隔離級。

缺省行為是設置下一個(未啟動的)事務的隔離級。如果你使用 global 關鍵詞,語句為所有在那個點上建立的新連接設置默認的全局事務隔離級。為了這樣做,你需要有 super 權限。使用 session 關鍵詞為當前連接所有將來執(zhí)行的事務設置默認的事務隔離級。

你可以使用 --transaction-isolation=... 為 mysqld 設置默認的全局隔離級。查看章節(jié) 4.1.1 mysqld 命令行選項。
 
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 芒康县| 双桥区| 泊头市| 久治县| 卢氏县| 库伦旗| 萨迦县| 仪征市| 昭通市| 临猗县| 建瓯市| 松潘县| 共和县| 区。| 南岸区| 临朐县| 阿坝| 林芝县| 靖江市| 巫溪县| 临城县| 监利县| 长沙市| 集安市| 蓬溪县| 乌鲁木齐市| 辽源市| 建水县| 玉田县| 永济市| 伊金霍洛旗| 滕州市| 镇江市| 成都市| 乌兰察布市| 岗巴县| 赫章县| 万宁市| 城口县| 恩平市| 英吉沙县|