首頁 資料庫 mysql教程 7.24 LOCK TABLES/UNLOCK TABLES句法 MySQL不支持事务环境 我靠!

7.24 LOCK TABLES/UNLOCK TABLES句法 MySQL不支持事务环境 我靠!

Jun 07, 2016 pm 03:52 PM
lock unlock

LOCK TABLES tbl_name [AS alias] {READ | [LOW_PRIORITY] WRITE} [, tbl_name {READ | [LOW_PRIORITY] WRITE} ...]...UNLOCK TABLES LOCK TABLES 为当前线程锁定表。 UNLOCK TABLES 释放被当前线程持有的任何锁。当线程发出另外一个 LOCK TABLES 时,或当服

LOCK TABLES tbl_name [AS alias] {READ | [LOW_PRIORITY] WRITE}
            [, tbl_name {READ | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES
登入後複製

LOCK TABLES为当前线程锁定表。UNLOCK TABLES释放被当前线程持有的任何锁。当线程发出另外一个LOCK TABLES时,或当服务器的连接被关闭时,当前线程锁定的所有表自动被解锁。

如果一个线程获得在一个表上的一个READ锁,该线程(和所有其他线程)只能从表中读。如果一个线程获得一个表上的一个WRITE锁,那么只有持锁的线程READWRITE表,其他线程被阻止。

每个线程等待(没有超时)直到它获得它请求的所有锁。

WRITE锁通常比READ锁有更高的优先级,以确保更改尽快被处理。这意味着,如果一个线程获得READ锁,并且然后另外一个线程请求一个WRITE锁, 随后的READ锁请求将等待直到WRITE线程得到了锁并且释放了它。当线程正在等待WRITE锁时,你可以使用LOW_PRIORITY WRITE允许其他线程获得READ锁。如果你肯定终于有个时刻没有线程将有一个READ锁,你应该只使用LOW_PRIORITY WRITE

当你使用LOCK TABLES时,你必须锁定你将使用的所有表!如果你正在一个查询中多次使用一张表(用别名),你必须对每个别名得到一把锁!这条政策保证表锁定不会死锁。

注意你应该锁定任何你正在用INSERT DELAYED使用的表,这是因为在这种情况下,INSERT被一个不同的线程执行。

通常,你不必锁定表,因为所有单个UPDATE语句是原语;没有其他线程能防碍任何其它正在执行SQL语句的线程。当你想锁定表,有一些情况:

  • 如果你将在一堆表上运行许多操作,锁定你将使用的表是较快的。当然缺点是,没有其他线程能更新一个READ锁定的表并且没有其他线程能读一个WRITE-锁定的表。
  • MySQL不支持事务环境,所以如果你想要保证在一个SELECT和一个UPDATE之间没有其他线程到来,你必须使用LOCK TABLES。下面显示的例子要求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,另外一个线程可能有一个机会在执行SELECTUPDATE语句之间往trans表中插入一个新行。

通过使用渐增更改(UPDATE customer SET value=value+new_value)或LAST_INSERT_ID()函数,在很多情况下你能使用LOCK TABLES来避免。

你也可以使用用户级锁定函数GET_LOCK()RELEASE_LOCK()解决一些情况,这些锁保存在服务器的一张哈希表中并且用pthread_mutex_lock()pthread_mutex_unlock()实现以获得高速度。见7.4.12 其他函数。

有关锁定政策的更多信息,见10.2.8 MySQL 怎样锁定表。

 

 

MySQL中所有锁定不会是死锁的。这通过总是在一个查询前立即请求所有必要的锁定并且总是以同样的顺序锁定表来管理。

WRITEMySQL使用的锁定方法原理如下:

  • 如果在表上没有锁,放一个锁在它上面。
  • 否则,把锁定请求放在写锁定队列中。

READMySQL使用的锁定方法原理如下:

  • 如果在表上没有写锁定,把一个读锁定放在它上面。
  • 否则,把锁请求放在读锁定队列中。

当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。

这意味着,如果你在一个表上有许多更改,SELECT语句将等待直到有没有更多的更改。

为了解决在一个表中进行很多INSERTSELECT操作的情况,你可在一张临时表中插入行并且偶尔用来自临时表的记录更新真正的表。

这可用下列代码做到:

mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> insert into real_table select * from insert_table;
mysql> delete from insert_table;
mysql> UNLOCK TABLES;
登入後複製

如果你在一些特定的情况字下区分检索的优先次序,你可以使用LOW_PRIORITY选项的INSERT。见7.14 INSERT句法。

你也能改变在“mysys/thr_lock.c”中的锁代码以使用一个单个队列。在这种情况下,写锁定和读锁定将有同样优先级,它可能帮助一些应用程序。

 

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java多執行緒中Lock怎麼使用 Java多執行緒中Lock怎麼使用 May 12, 2023 pm 02:46 PM

Jdk1.5以後,在java.util.concurrent.locks套件下,有一組實現線程同步的介面和類,說到線程的同步,可能大家都會想到synchronized關鍵字,這是java內建的關鍵字,用來處理線程同步的,但這個關鍵字有很多的缺陷,使用起來也不是很方便和直觀,所以就出現了Lock,下面,我們就來對比著講解Lock。通常我們在使用synchronized關鍵字的時候會遇到下面這些問題:(1)不可控性,無法做到隨心所欲的加鎖和釋放鎖。 (2)效率比較低下,例如我們現在並發的讀兩個文件,讀與讀之

Java中Lock的使用方式有哪些? Java中Lock的使用方式有哪些? Apr 23, 2023 pm 08:52 PM

1.作用(1)Lock方式來獲取鎖支援中斷、超時不獲取、是非阻塞的(2)提高了語義化,哪裡加鎖,哪裡解鎖都得寫出來(3)Lock顯式鎖可以給我們帶來很好的靈活性,但同時我們必須手動釋放鎖定(4)支援Condition條件物件(5)允許多個讀取線程同時存取共享資源2.lock用法//獲取鎖定voidlock()//如果當前線程未中斷,則取得鎖定voidlockInterruptibly()//傳回綁定至此Lock實例的新Condition實例ConditionnewCondition()//僅在呼叫時鎖定

Java Lock類別提供哪些功能? Java Lock類別提供哪些功能? Apr 21, 2023 am 08:16 AM

說明1、Lock是java.util.concurent套件下的接口,定義了一系列的鎖定操作方法。 2.Lock介面主要包括ReentrantLock、ReentrantReadWriteLock、ReentrantReadWriteLock、WriteLock實作類別。與Synchronized不同,Lock提供了取得鎖定、釋放鎖定等相關介面,使其使用更加靈活,操作更加複雜。實例ReentrantReadWriteLocklock=newReentrantReadWriteLock();Lockread

Java中為什麼需要提供Lock,而不只使用synchronized關鍵字? Java中為什麼需要提供Lock,而不只使用synchronized關鍵字? Apr 20, 2023 pm 05:01 PM

摘要:在Java中提供了synchronized關鍵字來保證只有一個執行緒能夠存取同步程式碼區塊。既然已經提供了synchronized關鍵字,為何在Java的SDK包中,還會提供Lock介面呢?這是不是重複造輪子,多此一舉呢?今天,我們就一起來探討下這個問題。在Java中提供了synchronized關鍵字來保證只有一個執行緒能夠存取同步程式碼區塊。既然已經提供了synchronized關鍵字,為何在Java的SDK包中,還會提供Lock介面呢?這是不是重複造輪子,多此一舉呢?今天,我們就一起來探討下

java中lock取得鎖定的方法有哪些 java中lock取得鎖定的方法有哪些 May 19, 2023 pm 01:13 PM

1.取得方法lock()、tryLock()、tryLock(longtime,TimeUnitunit)和lockInterruptibly()都是用來取得鎖的。 (1)lock()方法是平常使用得最多的一個方法,就是用來取得鎖。如果鎖已被其他線程獲取,則進行等待。 (2)tryLock()方法是有回傳值的,它表示用來嘗試取得鎖,如果取得成功,則傳回true,如果取得失敗(即鎖已被其他執行緒取得),則傳回false,也就說這個方法無論如何都會立即返回。在拿不到鎖時不會一直在那裡等待。 (3)tryLoc

Java技術堆疊中的常見問題及其解決方法 Java技術堆疊中的常見問題及其解決方法 Sep 06, 2023 am 09:59 AM

Java技術堆疊中的常見問題及其解決方法在開發Java應用程式時,我們常常會遇到一些問題,例如效能問題、記憶體洩漏、執行緒安全性等等。本文將介紹一些常見問題及其解決方法,並給出相應的程式碼範例。一、效能問題1.1頻繁創建物件導致的效能問題頻繁創建物件會導致垃圾回收的頻繁觸發,進而影響程式的效能。解決方法是使用物件池或快取重用物件。範例程式碼://使用物件池重複使用對象

透過 Auth0 Lock 實現 PHP 安全驗證 透過 Auth0 Lock 實現 PHP 安全驗證 Jul 24, 2023 am 11:16 AM

透過Auth0Lock實現PHP安全驗證隨著網際網路的發展,越來越多的應用程式需要進行使用者身份驗證和安全驗證,以保護使用者隱私和資料安全。 PHP是一種廣泛使用的後端語言,提供了許多方法來實現安全驗證。而Auth0是一個流行的身份驗證和授權平台,為開發人員提供了一個靈活和安全的方式來實現使用者身份驗證。 Auth0Lock是Auth0提供的一個

Java中Lock和Synchronized的差別是什麼 Java中Lock和Synchronized的差別是什麼 Apr 17, 2023 pm 07:19 PM

1.從功能角度來看Lock和Synchronized都是java中去用來解決線程安全問題的一個工具2.從特性來看Synchronized是java中的同步關鍵字,Lock是J.U.C包中提供的接口,而這個介面有很多的實現類,包括ReentrantLock這樣重入鎖的實現,Synchronized可以透過兩種方式去控制鎖的力度一種把synchronized關鍵字修飾在方法層面,另一種是修飾在程式碼區塊上,可以透過synchronized加鎖物件的生命週期,來控制鎖的作用範圍,鎖定物件是靜態物件或類別對

See all articles