MySQL(事务控制语言TCL)

Posted lnwd___

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL(事务控制语言TCL)相关的知识,希望对你有一定的参考价值。


一、事务的概念

事务:
一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行

二、事务的特性

ACID

 原子性:一个事务不可再分割,要么都执行要么都不执行
 一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
 隔离性:一个事务的执行不受其他事务的干扰
 持久性:一个事务一旦提交,则会永久的改变数据库的数据事务的创建

三、隐式事务和显示事务

隐式事务:事务没有明显的开启和结束的标记
比如:insertupdatedelete语句
delete fromwhere id=1
显示事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用

set autocommit=0#禁用事务

四、事务的步骤

步骤1:开启事务
set autocommit=0;
start transaction;#可选的
步骤2:编写事务中的SQL语句(select insert update delete这几个才可以编写事务,比如drop等就不行)
语句1;
语句2;
.....
步骤3:结束事务
commit;提交事务
rollback;回滚事务
savepoint 节点名;设置保存点
开启事务的语句;
updateset 张三丰的余额=500 where name=‘张三丰’
updateset 郭襄的余额=1500 where name=‘郭襄’
结束事务的语句;

五、三大范式

第一范式: 列不可再分
第二范式:属性完全依赖于主键
第三范式:属性不依赖于其他的非主属性,属性直接依赖于主键

六、事务步骤演示


创建一个演示的表叫account
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);

SELECT * FROM `account`;
#演示事务的使用步骤
#步骤1
SET autocommit=0;
START TRANSACTION;#可选的
#步骤2
UPDATE `account` SET `balance`=1000 WHERE `username`='张无忌';
UPDATE `account` SET `balance`=1000 WHERE `username`='赵敏';
#步骤3
#commit;
ROLLBACK;

七、事务的隔离级别(面试常考)

* 事务并发问题是如何产生的?
	- 当多个事务同时操作同一个数据库的相同数据时
* 事务并发问题
	- 脏读:一个事务读取到了另外一个事务未提交的数据
	- 不可重复读:同一个事务中,多次读取到的数据不一致
	- 幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据
* 处理事务并发问题,设置事务隔离级别
	- READ UNCOMMITTED
	- READ COMMITTED:可以避免脏读
	- REPEATABLE READ:可以避免脏读、不可重复读和一部分幻读
	- SERIALIZABLE:可以避免脏读、不可重复读和幻读`
* 注意:隔离级别从小到大安全性越来越高,但是效率越来越低
* 设置隔离级别
	- set session|global  transaction isolation level 隔离级别名;
* 查看隔离级别
	- select @@tx_i 

八、演示savepoint的使用

SELECT * FROM account;

SET autocommit=0;
START TRANSACTION;
DELETE FROM `account` WHERE id=1;
SAVEPOINT a;
DELETE FROM `account` WHERE id=2;
ROLLBACK TO a;

以上是关于MySQL(事务控制语言TCL)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL(事务控制语言TCL)

MySQL进阶(TCL 事务控制语言)

MySQL 数据查询语言(DQL)& 事务控制语言(TCL)详解

MySQL5.TCL语言

MySQl之TCL(数据事务语言)

TCL_事务控制语言