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
广告

© . All rights reserved.