MySQL(事务控制语言TCL)
Posted lnwd___
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL(事务控制语言TCL)相关的知识,希望对你有一定的参考价值。
一、事务的概念
事务:
一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
二、事务的特性
ACID
原子性:一个事务不可再分割,要么都执行要么都不执行
一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性:一个事务的执行不受其他事务的干扰
持久性:一个事务一旦提交,则会永久的改变数据库的数据事务的创建
三、隐式事务和显示事务
隐式事务:事务没有明显的开启和结束的标记
比如:insert、update、delete语句
delete from 表 where id=1;
显示事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用
set autocommit=0#禁用事务
四、事务的步骤
步骤1:开启事务
set autocommit=0;
start transaction;#可选的
步骤2:编写事务中的SQL语句(select insert update delete这几个才可以编写事务,比如drop等就不行)
语句1;
语句2;
.....
步骤3:结束事务
commit;提交事务
rollback;回滚事务
savepoint 节点名;设置保存点
开启事务的语句;
update 表 set 张三丰的余额=500 where name=‘张三丰’
update 表 set 郭襄的余额=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)的主要内容,如果未能解决你的问题,请参考以下文章