1.事务
概念
事务是一个原子操作,是一个最小执行单元,可以由一个或多个SQL语句组成,在同一个事务当中,所有的SQL语句都成功执行时,整个事务成功,有一个SQL语句执行失败,整个事务都执行失败
1.1事务的边界
开始:连接到数据库,执行一条DML语句,上一个事务结束后,又输入了一条DML语句,即事务的开始
结束:
- 提交
显示提交:commit
隐式提交:一条创建,删除的语句,正常退出;
- 回滚
显示回滚:rollback
隐式回滚:非正常退出(断电),执行了创建,删除的语句,但是失败了,会为这个无效的语句执行回滚.
1.2事务的原理
数据库回味每一个客户端都维护一个空间独立的缓存区(回滚段),一个事务张总所有的增删改查语句的执行结果都会缓存在回滚段中,只有当事务中所有SQL语句均正常结束(commit),才会将回滚段中的数据同步到数据库,否则无论因为那种原因失败,整个事务将回滚(rollback).
1.3事务的特性
Atomicity(原子性)
表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败.
Consistency(一致性)
表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态
Isolation(隔离性)
事务查看数据操作时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改后的状态,事务不会查看中间状态的数据
Durability(持久性)
持久性事务完成之后,它对于系统的影响时永久性的.
1.4语法:
- 开启事务
Start transaction
或
Begin;
SetAutoCommit=0;禁止自动提交,setAutoCommit=1;开启自动提交
- 事务内部数据操作语句
- 事务内语句都成功了,执行commit,事务内如果出现错误,执行rollback;
Commit;
或
ROLLBACK;
注意:当事务内数据操作语句出现错误时,不会继续向下执行.
CREATE TABLE users(
u_id INT PRIMARY KEY auto_increment,
u_name varchar(50),
u_money double
);
INSERT INTO users (u_name,u_money) VALUES ('张三',1000),('李四',1000);
START TRANSACTION;
UPDATE users SET u_money = u_money - 1000 WHERE u_id=1;
#出错了
UPDATE users SET u_money = u_money + 00 WHERE u_id=2;
COMMIT;
#ROLLBACK;
SELECT * FROM users;
2.权限管理
创建用户
语法: create user 用户名 IDENTIFIED BY 密码
授权
语法:GRANT ALL ON 数据库.表 to 用户名;
实例用户授权
撤销权限
语法:
REVOKE ALL ON 数据库.表名 from 用户名
注意:撤销权限后,账户要重新链接客户端才会生效
删除用户
语法:
DROP USER 用户名;
查看用户
Selct user from 数据库名.user;
3.视图
概念:
视图就是有数据库中一张表或者多张表根据特定的条件查询出的数据构造成的虚拟表
3.1视图的作用
安全性
简单性
数据独立
3.2创建视图
语法:
Create view 视图名称 as <select语句>
3.3查询视图结构
语法:
Desc 视图名称
3.4修改视图
语法
方式1
Create or replace view 视图名称
As 查询语句
方式2
Alter view 视图名称
As 查询语句
4.索引
索引,就是用来提高数据表中数据的查询效率,时将数据表中某一列/某几列的值取出来构造成便于查找的结构进行存储,生成数据表的目录
作用:提高SQL语句的执行效率
注意:
主键字段,唯一字段都是自带索引的
创建索引
Create index 索引名称 on 表名(字段名);
使用索引
在使用该字段的值作为条件时,数据库会自动使用该索引
删除索引
Drop index 索引名称 on 表名;
索引的分类
主键索引:表中的主键自带索引
唯一索引:表中使用唯一约束修饰的字段,自带唯一索引
普通索引:通过上面语法创建的就是普通索引
组合索引:两个及以上字段联合起来创建的索引
全文索引:mysql15.6出现,不支持中文
5.存储过程
SQL指令执行过程
存储过程
本质:将sql在数据库服务端预编译,使其可以提高执行效率
5.1优点:
- 提高效率
- 降低网络开销
- 提高安全性
- 存储过程提供了分支语句,循环语句变量等,可以帮助我们实现复杂业务.
5.2缺点:
1.要针对不同的数据库编写对应的存储过程
2.因为存储过程依赖于数据库服务软件,后期想优化将会收到限制.
3.在高并发的情况下存储过程将会导致数据库链接时间较长
5.3定义
语法:
Create procedure 存储过程名称 ([IN/out/INOUT args])
Begin
SQL语句
End;
例子:
Create procedure myadd ([IN a int, IN b int, OUT c int)
Begin
Set c=a+b;
End;
In:输入,类似于方法的形参
Out:输出,类似于方法的返回值
INOUT:可以作为输入,也可以作为输出
5.4调用
语法:
Call 存储过程名称(实参列表);
实例
Call myadd(@a,@num)
Select @a,@num from DUAL;
删除存储过程
Drop procedure 存储过程名;