MySQL - SET TRANSACTION 语句
MYSQL 中的 SET TRANSACTION 语句用于设置当前事务的特性,例如事务隔离级别和访问模式。
事务隔离级别
在多个事务同时并行执行的数据库系统中,隔离属性表示所有事务都将像系统中唯一的事务一样执行。任何事务都不会影响其他事务的存在。
MySQL 数据库提供了四种事务隔离级别,分别是:-
可重复读 - 假设一个事务中有多个非锁定的一致性 select 语句。第一个 SELECT 语句建立的快照将被后续语句读取。
已提交读 - 如果将事务隔离性设置为此值,则每个一致的 SELECT 语句都会读取其自己的快照。
未提交读 - 如果将事务隔离性设置为此值,则每个 SELECT 语句可能会使用行的未提交版本(即使来自之前的事务),从而影响当前事务的一致性,此类读取称为脏读。
可序列化读 - 如果将事务隔离性设置为此值,则事务将不允许脏读、不可重复读和幻读。
默认值为可重复读。
事务访问模式
您可以设置 MySQL将事务设置为 READ WRITE 或 READ ONLY 模式。默认情况下,设置为 READ WIRTE 模式。您无法使用 SET TRANSACTION 语句设置多个事务模式。
事务特性范围
您可以在全局和会话两个范围内设置事务的特性。
如果您设置 GLOBAL 范围,则所选特性适用于所有会话;如果您设置 GLOBAL 范围,则 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/mysql8/MySQL Server 8.0/Uploads/data.csv" into table employee FIELDS TERMINATED BY ',' LINES TERMINATED BY ' '; SAVEPOINT mysavepoint; load xml infile "C:/ProgramData/mysql8/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 |