TCL语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
# TCL
/*
Transaction Control Language 事务控制语言
事务:
一个或一组SQL语言组成一个执行单元,这个执行单元要么全部执行,要么全都不执行
案例:转账
张三丰:1000
郭襄:1000
UPDATE 表 SET 张三丰的余额 = 500 WHERE NAME = '张三丰'
意外
UPDATE 表 SET 郭襄的余额 = 1500 WHERE NAME = '郭襄'
含义:
通过一组逻辑操作单元(一组DML——sql语句),将数据从一种状态切换到另外一种状态
特性:ACID属性
1. 原子性(Atomicity):一个事务不可再分割。要么都执行,要么都不执行(回滚)
2. 一致性(Consistency):一个事务执行会使数据从一个一致状态切换到另外一个状态
3. 隔离性(Isolation):多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰。(隔离级别)
4. 持久性(Durability):一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改
事务的创建:
隐式事务:事务没有明显的开启和结束的标记
比如INSERT、UPDATE、DELETE语句
DELETE FROM 表 WHERE id = 1;
显式事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用
SET AUTOCOMMIT = 0; ##仅对当前事务有效
开启事务的语句;
UPDATE 表 SET 张三丰的余额 = 500 WHERE NAME = '张三丰'
UPDATE 表 SET 郭襄的余额 = 1500 WHERE NAME = '郭襄'
结束事务语句;
步骤1:开启事务
SET AUTOCOMMIT = 0;
START TRANSACTION; ### 可写可不写
步骤2:编写事务中的SQL语句(SELECT、INSERT、UPDATE、DALETE)
语句1;
语句2;
……
步骤3:结束事务
COMMIT; ## 提交事务
ROLLBACK; ## 回滚事务
*/
## 演示事务的使用步骤
DROP TABLE IF EXISTS account;
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
balance DOUBLE
);
INSERT INTO account(username, balance)
VALUES('张无忌', 1000), ('赵敏', 1000);
# 开启事务
SET autocommit = 0;
START TRANSACTION;
# 编写一组事务的语句
UPDATE account SET balance = 500 WHERE username = '张无忌';
UPDATE account SET balance = 1500 WHERE username = '赵敏';
# 结束事务
COMMIT;
SELECT * FROM account;
# 开启事务
SET autocommit = 0;
START TRANSACTION;
# 编写一组事务的语句
UPDATE account SET balance = 500 WHERE username = '张无忌';
UPDATE account SET balance = 1500 WHERE username = '赵敏';
# 回滚事务
ROLLBACK;
SELECT * FROM account;
#DELETE 和 TRUNCATE 在事务使用时的区别
#演示DELETE
SET AUTOCOMMIT = 0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;
SELECT * FROM account; #成功回滚
# 演示TRUNCATE
SET AUTOCOMMIT = 0;
START TRANSACTION;
TRUNCATE FROM account;
ROLLBACK;
SELECT * FROM account; #无法真正回滚
|
事务:事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事务开始以前的状态;如果单元中的所有SQL语句均执行成功,则事务被顺利执行。
存储引擎:
- 概念:在MySQL中的数据,用各种不同的技术存储在文件(或内存)中。
- 通过SHOW ENGINES; 来来查看MySQL支持的存储引擎。
- 在MySQL中用的最多的存储引擎有:INNODB、MYISAM、MEMORY等。其中INNODB支持事务,而MYISAM、MEMORY等不支持事务。
使用到的关键字
1
2
3
4
5
6
7
|
SET AUTOCOMMIT=0;
START TRANSACTION;
COMMIT;
ROLLBACK;
SAVEPOINT 断点名 # 设置保存点
ROLLBACK TO 断点名 # 回滚到保存点
|
事务的隔离级别:
事务并发问题如何发生?
事务的并发问题有哪些?
1
2
3
|
脏读:一个事务读取到了另外一个事务未提交的数据
不可重复读:同一个事务中,多次读取到的数据不一致
幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据 |
如何避免事务的并发问题?
1
2
3
4
5
|
通过设置事务的隔离级别:隔离级别越高,数据一致性就越好,但并发性越弱
1、READ UNCOMMITTED 会出现脏读、幻读、不可重复读(MySQL)
2、READ COMMITTED 可以避免脏读(Oracle 默认,MySQL)
3、REPEATABLE READ 可以避免脏读、不可重复读和一部分幻读 (MySQL 默认)
4、SERIALIZABLE可以避免脏读、不可重复读和幻读(Oracle,MySQL) |
设置隔离级别:
1
|
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别名;
|
设置数据库系统的全局的隔离级别:
1
|
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别名;
|
查看隔离级别:
1
|
SELECT @@tx_isolation; ## MySQL 8.0改成了transaction_isolation
|
文章作者
版权所有,转载请注明出处。工作请联系qiuyuling98@163.com
上次更新
2019-11-02
许可协议
原创文章,如需转载请注明文章作者和出处。谢谢!