MySQL學習筆記(13):鎖和事務

来源:https://www.cnblogs.com/garvenc/archive/2020/07/07/mysql_learning_13_lock_and_transaction.html
-Advertisement-
Play Games

本文更新於2019-09-22,使用MySQL 5.7,操作系統為Deepin 15.4。 鎖 鎖概述 MyISAM和MEMORY存儲引擎使用表級鎖。BDB存儲引擎進使用頁級鎖,但也支持表級鎖。InnoDB存儲引擎預設使用行級鎖,也支持表級鎖。 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生 ...


本文更新於2019-09-22,使用MySQL 5.7,操作系統為Deepin 15.4。

目錄

鎖概述

MyISAM和MEMORY存儲引擎使用表級鎖。BDB存儲引擎進使用頁級鎖,但也支持表級鎖。InnoDB存儲引擎預設使用行級鎖,也支持表級鎖。

  • 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最小。
  • 頁級鎖:開銷、加鎖時間、鎖粒度、併發度介於表級鎖和行級鎖之間;會出現死鎖。
  • 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度最高。

預設情況下,表級鎖和行級鎖都是自動獲取的。但在有些情況下,用戶需要明確進行鎖定。

MyISAM表級鎖

表級鎖有兩種模式:

  • 表共用讀鎖:允許併發讀,但會阻塞併發寫。
  • 表獨占寫鎖:阻塞併發讀和併發寫。

加鎖,如果表已被其他線程鎖定,則當前線程會等待直至獲得鎖:

LOCK TABLE|TABLES
tablename [AS alias] {READ [LOCAL]}|{[LOW_PRIORITY] WRITE}
[, ...]

加鎖時指定LOCAL,則允許在滿足MyISAM表併發插入條件(使用變數concurrent_insert控制)的情況下,其他用戶在表尾併發插入記錄。加鎖時,需一次鎖定所有用到的表,且同一個表在SQL語句中出現多少次,就要通過與SQL語句中相同的別名鎖定多少次(使用AS)。加鎖後,只能訪問加鎖的表,且不支持鎖升級(即如果是讀鎖,那麼只能執行讀操作,不能執行寫操作)。

MyISAM在執行讀操作(SELECT)前,會自動給涉及的所有表加讀鎖,在執行寫操作(UPDATEDELETEINSERT)前,會自動給涉及的所有表加寫鎖。

即使讀請求先到鎖等待隊列,寫請求後到,寫鎖也會插到讀鎖之前。可以使用max_write_lock_count給予讀請求獲得鎖的機會,或使用以下方法改變請求優先順序:

  • 通過指定啟動參數low-priority-updates,預設給予寫請求比讀請求更低的優先順序。
  • 通過執行SET low_priority_updates=1,給予該連接寫請求比讀請求更低的優先順序。
  • 通過指定INSERTUPDATEDELETE語句的LOW_PRIORITY,降低該語句的優先順序。

解鎖,釋放當前線程獲得的所有鎖:

UNLOCK TABLES

如在鎖表期間,當前線程執行另一個LOCK TABLESSTART TRANSACTION(對InnoDB存儲引擎),或與伺服器的連接被關閉時,會隱含地執行UNLOCK TABLES

通過SHOW STATUS LIKE 'table_locks%'查看表級鎖使用情況。table_locks_waited比較高說明存在較嚴重的表級鎖爭用。

InnoDB行級鎖

可以通過SHOW STATUS LIKE 'innodb_row_lock%',或查看information_schema中相關的表,或通過設置InnoDB Monitors查看行級鎖爭奪情況。

InnoDB實現了兩種類型的行級鎖:

  • 共用鎖(S):允許一個事務取讀一行,阻止其他事務獲得相同行的排他鎖。
  • 排他鎖(X):允許獲得排他鎖的事務更新數據,阻止其他事務取得相同行的共用鎖和排他鎖。

另外,為了允許行級鎖和表級鎖共存,InoDB還有兩種內部使用的意向鎖,二者都是表鎖:

  • 意向共用鎖(IS):事務在給數據行加S鎖前,必須先取得該表的IS鎖。
  • 意向排他鎖(IX):事務在給數據行加X鎖前,必須先取的該表的IX鎖。

InoDB行級鎖模式相容性如下(縱向是當前鎖模式,橫向是請求鎖模式):

X IX S IS
X 衝突 衝突 衝突 衝突
IX 衝突 相容 衝突 相容
S 衝突 衝突 相容 相容
IS 衝突 相容 相容 相容

對於UPDATEDELETEINSERT語句會自動給涉及數據集加排他鎖(X)。對普通SELECT語句不會加任何鎖,可通過select_statement LOCK IN SHARE MODE加共用鎖或select_statement FOR UPDATE加排他鎖,並需進行提交或回滾。

意向鎖是InnoDB自動加的。

InnoDB行級鎖是通過給索引上的索引項或間隙加鎖來實現的,共分三種:

  • Record鎖:對索引項加鎖。
  • Gap鎖:對索引項之間的間隙(包括第一條記錄前和最後一條記錄後)加鎖。
  • Next-Key鎖:前兩種的組合,對索引項和間隙加鎖。當使用範圍條件而不是相等條件加鎖時,會對符合條件的已有記錄的索引項加鎖,對並不存在相應記錄但索引值在範圍內的間隙(GAP)也會加鎖。如果使用相等條件給一個不存在的記錄加鎖,也會使用Next-Key鎖。InnoDB使用Next-Key鎖的目的,一方面為了防止幻讀,另一方面為了滿足其恢復和複製的需要。

InnoDB行級鎖的特點,需註意如下問題:

  • 如不通過索引條件查詢時,會鎖定表中的所有記錄,就如表級鎖。
  • 雖然是訪問不同的行,但如果使用的是相同的索引項,是會出現鎖衝突的。這是因為行級鎖是對索引加鎖,而不是對記錄加鎖。
  • 當表有多個索引時,不同的事務可以使用不同的索引鎖定不同的行。但如果是相同的行,則會等待。
  • 即使在條件中使用了索引欄位,但是否使用索引是由MySQL通過判斷不同執行計劃的代價決定的。

InnoDB存儲引擎中不同SQL在不同隔離級別下的鎖比較(off/on指變數innodb_locks_unsafe_for_binlog的值):

SQL 條件 未提交讀 已提交讀 可重覆讀 可序列化
SELECT 相等 無鎖 一致性讀/無鎖 一致性讀/無鎖 共用鎖
SELECT 範圍 無鎖 一致性讀/無鎖 一致性讀/無鎖 共用Next-Key鎖
UPDATE 相等 排他鎖 排他鎖 排他鎖 排他鎖
UPDATE 範圍 排他Next-Key鎖 排他Next-Key鎖 排他Next-Key鎖 排他Next-Key鎖
INSERT 排他鎖 排他鎖 排他鎖 排他鎖
REPLACE 無鍵衝突 排他鎖 排他鎖 排他鎖 排他鎖
REPLACE 鍵衝突 排他Next-Key鎖 排他Next-Key鎖 排他Next-Key鎖 排他Next-Key鎖
DELETE 相等 排他鎖 排他鎖 排他鎖 排他鎖
DELETE 範圍 排他Next-Key鎖 排他Next-Key鎖 排他Next-Key鎖 排他Next-Key鎖
SELECT ... FROM ... LOCK IN SHARE MODE 相等 共用鎖 共用鎖 共用鎖 共用鎖
SELECT ... FROM ... LOCK IN SHARE MODE 範圍 共用鎖 共用鎖 共用Next-Key鎖 共用Next-Key鎖
SELECT ... FROM ... FOR UPDATE 相等 排他鎖 排他鎖 排他鎖 排他鎖
SELECT ... FROM ... FOR UPDATE 範圍 排他鎖 排他鎖 排他Next-Key鎖 排他Next-Key鎖
INSERT INTO ... SELECT ...(源表鎖) off 共用Next-Key鎖 共用Next-Key鎖 共用Next-Key鎖 共用Next-Key鎖
INSERT INTO ... SELECT ...(源表鎖) on 無鎖 一致性讀/無鎖 一致性讀/無鎖 共用Next-Key鎖
CREATE TABLE ... SELECT ...(源表鎖) off 共用Next-Key鎖 共用Next-Key鎖 共用Next-Key鎖 共用Next-Key鎖
CREATE TABLE ... SELECT ...(源表鎖) on 無鎖 一致性讀/無鎖 一致性讀/無鎖 共用Next-Key鎖

INSERT INTO ... SELECT ...CREATE TABLE ... SELECT ...叫做不確定的SQL,屬於不安全的SQL,不推薦使用。如確實需要使用,又不希望因加鎖對源表併發更新產生影響,可使用以下方法:

  • innodb_locks_unsafe_for_binlog設置為on,強制使用多版本資料庫(MVCC),但可能無法使用binlog正確恢復和複製數據。
  • 使用SELECT ... INTO OUTFILE ...LOAD DATA INFILE ...間接實現,這種方式不會對源表加鎖。
  • 使用基於行數據的binlog格式和基於行數據的複製。

InnoDB表級鎖

以下兩種情況可以考慮使用表級鎖:

  • 事務需要更新大部分或全部數據,表又比較大。
  • 事務涉及多個表,很可能引起死鎖,造成大量事務回滾。

使用表級鎖需要註意:

  • 雖然LOCK TABLES可以給InnoDB表加表級鎖,但表級鎖不是由InnoDB存儲引擎管理的,而是由其上一層——MySQL Server管理的。僅當autocommit=0innodb_table_locks=1時,InnoDB才能知道MySQL Server加的表級鎖,MySQL Server也才能知道InnoDB加的行級鎖。這樣InnoDB才能自動識別涉及表級鎖的死鎖。
  • 在用LOCK TABLES給InnoDB表加鎖時,需將autocommit設為0。事務結束前,不要用UNLOCK TABLES,因其會隱含地提交事務。COMMITROLLBACK不能釋放表級鎖,必須使用UNLOCK TABLES

死鎖

MyISAM總是一次獲得所需的全部鎖,要麼全部滿足,要麼等待,因此不會出現死鎖。InnoDB,除單個SQL組成的事務外,鎖是逐步獲得的,這就決定了InnoDB可能發生死鎖。

發生死鎖後,InnoDB一般都能自動檢測到,並使一個事務釋放鎖並回滾,另一個事務獲得鎖繼續完成事務。但在涉及外部鎖或涉及表級鎖的情況下,InnoDB並不能完全自動檢測到死鎖,這需要通過設置鎖等待超時參數innodb_lock_wait_timeout解決。

減少鎖衝突和死鎖的方法:

  • 儘量使用較低的隔離級別。
  • 精心設計索引,並儘量使用索引訪問數據,使加鎖更精確,從而減少鎖衝突的機會。
  • 選擇合理的事務大小,小事務發生鎖衝突的幾率也小。
  • 儘量用相等條件訪問數據,這樣可以避免Next-Key鎖對併發插入的影響。
  • 不要申請超過實際需要的鎖級別,除非必需,查詢時不要顯式加鎖。
  • 對於一些特定的事務,可以使用表鎖來提高處理速度或減少發生死鎖的幾率。
  • 在應用中,如果不同的程式會併發存取多個表,應儘量約定以相同順序來訪問表,這樣可以大大降低鎖死發生的概率。
  • 在程式以批量方式處理數據的時候,如果實現對數據排序,保證每個線程按固定的順序來處理記錄,也可以大大降低出現死鎖的可能。
  • 在事務中,如果要更新記錄,應該直接申請足夠級別的鎖,即排他鎖,而不應先申請共用鎖,更新時再申請排他鎖,因為用戶申請排他鎖時,其他事務可能又已經獲得了相同記錄的共用鎖,從而造成鎖衝突,甚至死鎖。
  • 在可重覆讀隔離級別下,如果兩個線程同時對相同條件的記錄用SELECT ... FOR UPDATE加排他鎖,在沒有符合該條件記錄的情況下,兩個線程都會加鎖成功。程式發現記錄尚不存在,就試圖插入一條新記錄,如果兩個線程都這麼做,就會出現死鎖。這種情況將隔離級別改成已提交讀就可避免問題。
  • 當隔離級別為已提交讀時,如果兩個線程都先執行SELECT ... FOR UPDATE判斷是否存在符合條件的記錄,如果沒有就插入記錄。此時,只有一個線程能插入成功,另一個線程會出現鎖等待。等第一個線程提交後,第二個線程會因主鍵重出錯,但雖然這個線程出錯了,卻會獲得一個排他鎖!這時如果有第三個線程來申請排他鎖,也會出現死鎖。對於這種情況,可以直接做插入操作,然後再捕獲主鍵重異常,或者在遇到主鍵重錯誤時,總是執行ROLLBACK釋放獲得的排他鎖。

可以使用SHOW ENGINE INNODB STATUS查看最後一個死鎖產生的原因。

事務

事務概述

事務的ACID屬性:

  • 原子性(Actomicity):事務是一個原子操作單元,對數據的修改,要麼全都執行,要麼全都不執行。
  • 一致性(Consistent):在事務開始和完成時,數據必須保持一致狀態。即所有相關的數據規則都必須應用於事務中對數據的修改,所有內部數據結構(如索引)也必須是正確的。
  • 隔離性(Isolation):提供一定的隔離機制,保證事務不受外部併發操作的影響,事務處理過程的中間狀態對外部是不可見的。
  • 持久性(Durable):事務完成後,其對數據的修改是永久性的。

併發事務處理的問題:

  • 更新丟失:當多個事務選擇同一行,然後基於最初選定的值更新該行時,由於每個事務都不知道其他事務的存在,最後的更新覆蓋了由其他事務所做的更新。
  • 臟讀:一個事務正在對一條記錄做修改,在這個事務提交前,如果另一個事務也來讀取同一條記錄,就會讀取到臟數據(如果不加控制,讀取到第一個事務修改的數據,而後第一個事務回滾,第二個事務讀取到的數據就處於不一致狀態)。
  • 不可重覆讀:一個事務在讀取某些數據後的某個時間,再次讀取以前讀取過的數據,卻發現其讀出的數據已經發生改變或被刪除。
  • 幻讀:一個事務按照相同的查詢條件重新讀取以前檢索過的數據,卻發現其他事務插入了滿足查詢條件的新數據。

防止更新丟失是應用的責任,需要應用對要更新的數據加鎖來解決。臟讀、不可重覆讀、幻讀其實都是資料庫讀一致性問題,必須由資料庫提供一定的事務隔離機制來解決。事務隔離實質上是使事務在一定程度上串列化。資料庫實現事務隔離的方式基本上分兩種:

  • 在讀數據前加鎖,阻止其他事務對數據進行修改。
  • 數據多版本併發控制(MultiVersion Concurrency Control,簡稱MVCC或MCC),也稱為多版本資料庫。不用加鎖,通過生成數據請求時間點的一致性數據快照來提供一定級別的一致性讀取。

有以下4個事務隔離級別:

隔離級別 讀一致性 臟讀 不可重覆讀 幻讀
未提交讀(Read Uncommitted) 最低級別,只能保證不讀取物理上損壞的數據
已提交讀(Read Committed) 語句級
可重覆讀(Repeatable read) 事務級
可序列化(Serializable) 最高級別,事務級

可使用語句改變事務隔離級別:

SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED}|{READ COMITTED}|{REPEATABLE READ}|SERIALIZABLE

InnoDB事務

預設情況下,InnoDB是自動提交事務的,即每執行一條語句提交一次事務。可設置變數autocommit指定是否自動提交。

在同一個事務中,最好不要使用不同存儲引擎的表,否則ROLLBACK需要對非事務表進行特別的處理,因為COMMITROLLBACK只能對事務表有效。通常情況下,只對提交的事務記錄到二進位日誌中,但如果一個事務中包含非事務表,那麼回滾的操作也會被記錄到二進位日誌中,以確保非事務表的更新也可以被覆制到從資料庫中。

所有的DDL語句都是不能回滾的,並且部分DDL語句會造成隱式的事務提交。

開始事務:

{START TRANSACTION}|{BEGIN [WORK]}

提交事務:

COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]

回滾事務,可以回滾到指定的savepointname。註意,可以回滾事務的一個部分,但不能提交事務的一個部分:

ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] [TO SAVEPOINT savepointname]

CHAINRELEASE子句用於定義事務提交或回滾後的操作:CHAIN會立即啟動一個新事務,並且和原先的事務有相同的隔離級別;RELEASE會斷開客戶端和伺服器之間的連接。預設是NO CHAIN NO RELEASE

定義SAVEPOINT。可以定義多個SAVEPOINT,如果定義了相同名字的SAVEPOINT,則後面定義的覆蓋前面定義的:

SAVEPOINT savepointname

刪除SAVEPOINT

RELEASE SAVEPOINT savepointname

分散式事務

當前分散式事務只支持InnoDB存儲引擎。

一個分散式事務會涉及多個分支事務(XA事務),這些XA事務必須一起被提交,或一起被回滾。

使用分散式事務的應用程式涉及一個或多個資源管理器和一個事務管理器:

  • 資源管理器(RM):必須可以提交和回滾由TM管理的事務。當執行XA語句時,MySQL伺服器相當於資源管理器。
  • 事務管理器(TM):與RM進行通信,用於協調作為分散式事務一部分的各個XA事務。當執行XA語句時,與伺服器連接的客戶端相當於事務管理器。

執行分散式事務的過程使用兩階段提交:

  1. 第一階段,所有分支事務被預備好,即它們被TM告知準備提交。
  2. 第二階段,TM告知所有RM需要提交還是回滾。如果在第一階段,所有XA事務指示都能提交,則在第二階段所有XA事務都被告知需要提交;如在第一階段,任一XA事務指示不能提交,則在第二階段所有XA事務都被告知需要回滾。

啟動XA事務:

XA START|BEGIN xid [JOIN|RESUME]

每個XA事務必須有一個唯一的xid,該值不能被其他的XA事務使用。xid由客戶端提供,或由MySQL伺服器生成,包含3個部分:'gtrid'[,'bqual'[,formatID]]

  • gtrid是分散式事務標識符,相同的分散式事務應使用相同的gtrid。
  • bqual是一個分支限定符,預設是空串。對一個分散式事務中的每個XA事務,bqual值必須是唯一的。
  • formatID是一個數字,用於標識gtrid和bqual值使用的格式,預設是1。

使XA事務進入PREPARE狀態,也即兩階段提交的第一階段:

XA END xid [SUSPEND [FOR MIGRATE]];
XA PREPARE xid;

提交XA事務,進入兩階段提交的第二階段:

XA COMMIT xid [ONE PHASE]

回滾XA事務,進入兩階段提交的第二階段:

XA ROLLBACK xid

返回當前資料庫中處於PREPARE狀態的XA事務詳細信息:

XA RECOVER

MySQL的分散式事務還存在比較嚴重的缺陷:

  1. 如果XA事務在到達PREPARE狀態時,資料庫異常重啟後,可以繼續對XA事務進行提交或回滾,但提交的事務沒有寫如binlog,可能導致使用binlog恢復時丟失部分數據。如果存在複製的資料庫,則有可能導致主從資料庫的數據不一致。
  2. 如果某個XA事務的客戶端連接異常終止,資料庫會自動回滾未完成的XA事務。如果此時XA事務已經執行到PREPARE狀態,那麼這個分散式事務的其他XA事務可能已經提交。這個XA事務回滾,會導致分散式事務不完整。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 現象 今天協助其他同學排查問題的時候,發現資料庫錯誤日誌文件已經有9G以上了,打開內容查看如下: 2020-07-08 13:47:43 0x7fe3723ff700 INNODB MONITOR OUTPUT Per second averages calculated from the l ...
  • 墨天輪資料庫周刊第31期發佈啦,每周1次推送本周資料庫相關熱門資訊、精選文章、乾貨文檔。 ...
  • SQL自學筆記 SQL的自我介紹 SQL分類的畫圖演示 DDL 操作資料庫 1.0 查詢和創建 2.0 修改、刪除、使用 操作表 1.0 查詢 e 2.創建 3.刪除 4.修改 DML 1.0 添加數據 2.0 刪除 3.0 修改 DQL 1.0 基礎查詢 2.0 條件查詢 3.模糊查詢 4.排序查 ...
  • MySQL 對window函數執行sum函數疑似Bug 使用MySql的視窗函數統計數據時,發現一個小的問題,與大家一起探討下。 環境配置: mysql-installer-community-8.0.20.0 問題點:在sum對window函數執行時,如果有重覆數據,會直接把相同的數據相加,並不是 ...
  • 大概在去年的時候,做項目中遇到這麼一個需求,如圖所示,根據Type欄位篩選查找對應數據行,並找到該行欄位為Levels中值最小的數據,例如當Type=1的時候,取出來的是0,當Type=2的時候,取出來的是2,當Type=3的時候,取出來的是1,當我第一次看到數據存儲方式的時候,我是有點吃驚的,因為 ...
  • 如何監控PostgreSQL存儲過程/函數代碼運行?本文介紹用python+微信/郵件的方式進行報警、監控。 首先要有一張表、用於存放PostgreSQL存儲過程/函數代碼運行異常的信息。 處理原則:若出現異常;把“發生時間+所在的程式+**原因”**通過微信/郵件發給對應人員。當然發送一次即可;起 ...
  • 前言 eCharts作為國內優秀的開源圖表工具,功能強大,但是使用中也存在一定的問題。 文檔更新較慢,文檔說明不詳細。 前端使用的弱類型語言,數據結構在靈活的同時,也容易造成一些問題。例如某些屬性到底應該放入怎麼樣的數據才是正確的(文檔也沒有提到)。 大小寫敏感,配置不但拼寫要正確,大小寫也不能錯 ...
  • 我是風箏,公眾號「古時的風箏」。 文章會收錄在 JavaNewBee 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裡面。 沒別的意思,今天就是為了給你推薦幾款 MySQL 客戶端,這幾款客戶端有一個共通點,那就是好用而且免費。 “害,我看也就是平平無奇嘛!” 然後,轉身趕緊下載體驗一下 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...