TCL:TRANSACTION Control LANGUAGE 事务控制语言
事务:一条或一组SQL语言组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
入门案例:转账
张三丰 1000
郭襄 1000
UPDATE 表 SET 张三丰的余额=500 WHERE NAME = '张三丰'
出现意外
UPDATE 表 SET 郭襄的余额=1500 WHERE NAME = '郭襄'
#显示存储引擎
SHOW ENGINES;
INNODB 支持事务
事务的特点:ACID属性
原子性(A):事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
一致性(C):事务必须使数据库从一个一致性状态切换到另一个一致性状态(数据库是完整的,准确的)
隔离性(I):一个事务的执行不能被其他事务干扰,对其他并发事务是隔离的,不能互相干扰
持久性(D):一个事务一旦被提交,对数据的改变就是永久的,接下来的其他操作和数据库故障不应该对其有任何影响
事务的创建
隐式事务:事务没有明显的开启和结束的标记,会自动开启
比如INSERT、UPDATE、DELETE语句
查看自动提交功能的情况
SHOW VARIABLES LIKE 'autocommit';
显示事务:事务有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用:SET autocommit = 0;
开启事务的语句;
UPDATE 表 SET 张三丰的余额=500 WHERE NAME = '张三丰'
UPDATE 表 SET 郭襄的余额=1500 WHERE NAME = '郭襄'
结束事务的语句;
步骤1:开启事务
SET autocommit = 0
START transacion;可选的
步骤2:编写事务中的SQL语句(SELECT INSERT UPDATE DELETE)
语句1;
语句2;
···
步骤3:结束事务
COMMIT;提交事务
ROLLBACK;回滚事务
SAVEPOINT 节点名; 设置保存点
演示事务的使用步骤
DROP TABLE IS EXISTS account;
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
balance DOUBLE
);
INSERT INTO account(username,balance)
VALUES('张无忌',100),('赵敏',1000);
案例1:正常提交事务
#开启事务
SET autocommit = 0;
START TRANSACTION;
#编写一组事务的语句
UPDATE account SET balance = 500 WHERE username = '张无忌';
UPDATE account SET balance = 1500 WHERE username = '赵敏';
#结束事务
COMMIT;
案例2:回滚事务
#开启事务
SET autocommit = 0;
START TRANSACTION;
#编写一组事务的语句
UPDATE account SET balance = 1000 WHERE username = '张无忌';
UPDATE account SET balance = 1000 WHERE username = '赵敏';
#结束事务
ROLLBACK;
#commit;
在结束之前,都是在内存操作的,没有提交
2.delete和truncate在事务使用时的区别
演示DELETE,支持回滚
SET autocommit = 0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;
SELECT * FROM account;
演示TRUNCATE,不支持回滚
SET autocommit = 0;
START TRANSACTION;
TRUNCATE TABLE account;
ROLLBACK;
SELECT * FROM account;
并发事务
- 何时发生:多个事务同时操作同一个数据库的相同数据时
- 并发问题都有哪些:
- 脏读:t1读取了t2还没有提交的数据,然后t2回滚了,则t1读取的内容就是临时且无效的
- 不可重复读:t1读取了一个字段,然后t2更新了,之后t1再读取,值有所不同
- 幻读:t1读取了一个字段之后,t2插入(删除)了几行数,t1再读取之后表变了
通过设置隔离级别解决并发事务
mysql一共4种隔离级别,默认的隔离级别是 REPEATABLE READ
事务的隔离级别:
| -- | 脏读 | 幻读 | 不可重复读 |
|---|---|---|---|
| READ UNCOMMITTED | √ | √ | √ |
| READ COMMITTED | × | √ | √ |
| REPEATABLE READ | × | × | √ |
| SERIALIZABLE | × | × | × |
mysql 中默认第三个隔离级别 REPEATABLE READ
oracle 中默认第二个隔离级别 READ COMMITTED
查看隔离级别:
mysql8.0:SELECT @@transcation_isolation;
mysql5.0:SELECT @@tx_isolation;
设置隔离级别
SET SESSION | GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;
- 演示SAVEPOINT的使用,只能搭配ROLLBACK TO
SET autocommit = 0;
START TRANSACTION ;
DELETE FROM account WHERE id = 1;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id = 2;
ROLLBACK TO a;#回滚到保存点
SELECT * FROM account;