事务特性
- 原子性(完整性,事务不可分割)
- 一致性(从一个状态=>另外一个一致性状态)
- 隔离性(事务之间互相不影响)
- 持久性(事务提交后,数据的改变是永久的)
事务实现
隐形事务
#默认每条单独语句都开启了事务
SELECT/UPDATE/INSERT/ DELECT
显示事务
步骤1:开启事务
set autocommit=0;
start transaction;可忽略
步骤2:编写事务中的sql语句(select,insert,update,delete)
语句1;
语句2;
...
步骤3:结束事务
commit;提交事务
rollback;回滚事务
MYSQL 事务处理主要有两种方法:
1、用 BEGIN, ROLLBACK, COMMIT来实现
- BEGIN 开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
- SET AUTOCOMMIT=0 禁止自动提交
- SET AUTOCOMMIT=1 开启自动提交
delect和truncate在事务中区别
delect可以被事务回滚,truncate无法在事务中回滚
事务隔离
并发事务处理
- 脏读
- 幻读
- 不可重复读
生命周期 读取数据 持久化数据 示例 脏读 A事务读取,B事务COMMIT之前临时数据 sql执行前内存中数据 sql执行后数据 幻读 A事务对AB交集处理,B事务COMMIT前操作交集,COMMIT之后也操作交集 会被B事务操作影响 不可重复读 A事务,同一sql多次读取结果不一致。 读COMMIT前数据和COMMIT后的数据
处理事务隔离
- 防止多个事务同时操作
- 类似多线程的同步锁
视图
视图语句本身增删改操作
视图添加
CREATE VIEW 视图名 AS 查询语句
视图修改
ALTER VIEW 视图名 AS 查询语句
CREATE OR REPLACE 视图名 AS 查询语句
视图删除
DROP 视图1,视图2..
视图与表区别
针对视图生成虚拟表的增删改操作(不推荐)
用法 | 是否占用物理空间 | 使用 | |
表 | create table | 是 | 增删改查 |
视图 | create view | 否 | 一般只用于查 |
变量
作用域 | 定义和使用地方 | 语法 | 示例 | 关键字 | |
会话变量 | 当前会话 | 会话中任何地方 | 必须@符号 | SET @a=1 SET @b=2 @sum=@a+@b | DECLARE 定义变量 |
用户变量 | BEGIN ...END之间 | 只能在BEGIN.END之间,且只能为第一句话 | 一般不用@符号 | | SET 设置变量 |
存储过程
#删除存储过程
DROP PROCEDURE sp1;
#创建存储过程-更新存储(ALTER)过程只针对修改特征
CREATE PROCEDURE sp1 () BEGIN
INSERT INTO dep2 ( `ID`, `NAME`, age )
VALUES
( 1, '张三', 10 ),
( 2, '张三2', 10 ),
( 3, '张三33', 10 ),
( 4, '张三4', 10 ),
( 5, '里斯3', 18 );
END ;
#调用存储过程
CALL sp1();
登陆过程示例
DROP PROCEDURE login;
CREATE PROCEDURE login (
IN userName VARCHAR ( 20 ),
IN psd VARCHAR ( 20 )) BEGIN
#定义变量
DECLARE
num INT DEFAULT 0 ;
#对变量赋值
SELECT
COUNT(*) INTO num
FROM
manger
WHERE
userName = manger.`NAME`
AND psd = manger.`password`;
SELECT
IF
( num = 0, "密码错误", "登陆成功" );
END;
CALL login ( '张三', 123 );
CALL login ( '张三', 1323 );
自定义函数
// 创建格式
CREATE FUNCTION 函数名(形参) RETURNS 数据类型
BEGIN
函数体
RETURN 结果
END;
//示例
DELIMITER $$
DROP FUNCTION IF EXISTS genPerson$$
CREATE FUNCTION genPerson(name varchar(20)) RETURNS varchar(50)
BEGIN
DECLARE str VARCHAR(50) DEFAULT '';
SET @tableName=name;
SET str=CONCAT('create table ', @tableName,'(id int, name varchar(20));');
return str;
END $$
//执行函数
SELECT genPerson(实参) AS 函数列名
函数头为RETURNS函数体中为RETURN,单复数区别。同理其他也可能