MySQL - SET TRANSACTION 語句



MYSQL 中的 SET TRANSACTION 語句用於將值設定為當前事務的特性,例如事務隔離級別和訪問模式。

事務隔離級別

在多個事務同時並行執行的資料庫系統中,隔離屬性規定所有事務都將被執行,就好像它是系統中唯一的交易一樣。任何事務都不會影響任何其他事務的存在。

MySQL 資料庫提供了四個事務隔離級別,它們是:

  • REPEATABLE READ - 如果在一個事務中有多個非鎖定一致性 SELECT 語句。後續的 SELECT 語句會讀取第一個 SELECT 語句建立的快照。

  • READ COMMITTED - 如果事務隔離設定為此值,則每個一致性 SELECT 語句都會讀取自己的快照。

  • READ UNCOMMITTED - 如果事務隔離設定為此值,則 SELECT 語句可能會使用行的未提交版本(甚至來自先前的事務),從而影響當前事務的一致性,此類讀取稱為髒讀。

  • SERIALIZABLE - 如果事務隔離設定為此值,則事務將不允許髒讀、不可重複讀和幻讀。

預設值為 REPEATABLE READ。

事務訪問模式

您可以將 MySQL 事務設定為 READ WRITE 或 READ ONLY 模式。預設情況下,它設定為 READ WRITE 模式。您不能使用 SET TRANSACTION 語句設定多個事務模式。

事務特性範圍

您可以在兩個範圍內設定事務的特性:全域性和會話。

如果設定 GLOBAL 範圍,則選擇的特性適用於所有會話;如果設定 SESSION 範圍,則 SET 語句僅適用於當前會話中的後續事務。

語法

以下是 SET TRANSACTION 語句的語法:

SET [GLOBAL | SESSION] TRANSACTION
   { ISOLATION LEVEL level | access_mode}

示例

假設我們使用 CREATE 語句建立了一個表,如下所示:

CREATE TABLE EMPLOYEE(
   FIRST_NAME VARCHAR(20),
   LAST_NAME VARCHAR(20),
   AGE INT,
   INCOME INT
);

如果我們有一個 .csv 檔案和一個 .xml 檔案,其內容如下

data.xml

<rowgt;
   <FIRST_NAMEgt;Javed</FIRST_NAMEgt;
   <LAST_NAMEgt;Syed</LAST_NAMEgt;
   <AGEgt;25</AGEgt;
   <INCOMEgt;9855</INCOMEgt;
</rowgt;
<rowgt;
   <FIRST_NAMEgt;Abhinav</FIRST_NAMEgt;
   <LAST_NAMEgt;Gomatam</LAST_NAMEgt;
   <AGEgt;30</AGEgt;
   <INCOMEgt;7000</INCOMEgt;
</rowgt;

data.csv

'Krishna','Sharma',19,2000
'Raj','Kandukuri',20,7000

以下 MySQL 事務嘗試將這些檔案的內容插入到表中:

START TRANSACTION;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
LOAD DATA INFILE "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/data.csv" 
into table employee
   FIELDS TERMINATED BY ','
   LINES TERMINATED BY '\n';
   SAVEPOINT mysavepoint;
load xml infile "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/data.xml" 
into table employee ROWS IDENTIFIED BY '<row>';

如果您驗證上述表的內容,您可以觀察到所有插入的記錄,如下所示:

SELECT * FROM EMPLOYEE;

輸出

以上查詢產生以下輸出:

FIRST_NAME LAST_NAME AGE INCOME
'Krishna' 'Sharma' 19 2000
'Raj' 'Kandukuri' 20 7000
Javed Syed 25 9855
Abhinav Gomatam 30 7000

以下語句將上次儲存點的更改恢復:

ROLLBACK TO SAVEPOINT mysavepoint;

之後,如果您驗證內容,您將只能看到兩條記錄:

select * FROM EMPLOYEE;

輸出

以下是上述 mysql 查詢的輸出:

FIRST_NAME LAST_NAME AGE INCOME
'Krishna' 'Sharma' 19 2000
'Raj' 'Kandukuri' 20 7000
廣告