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语句均执行成功,则事务被顺利执行。

存储引擎:

  1. 概念:在MySQL中的数据,用各种不同的技术存储在文件(或内存)中。
  2. 通过SHOW ENGINES; 来来查看MySQL支持的存储引擎。
  3. 在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
当多个事务同时操作同一个数据库的相同数据时

事务的并发问题有哪些?

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