尚硅谷mysql | TCL语言(事务)

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;

并发事务

  1. 何时发生:多个事务同时操作同一个数据库的相同数据时
  2. 并发问题都有哪些:
  • 脏读: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 隔离级别;
  1. 演示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;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容