事务

基本概念

  • 事务: Transaction
  • 事务是由一个或多个sql语句构成的逻辑单元, 是一个整体的概念
  • 作用: 使得一系列sql语句要么全部完成, 要目全部不完成, 保证了数据库的完整性

四大特性(ACID)

  • 原子性 (Atomicity): 事务是最小执行单位, 不可再分, 既一个事务中的所有操作, 要么全部完成, 要么全部不完成
  • 一致性 (Consistency): 事务开始之前和结束之后, 数据库的完整性没有被破坏
  • 隔离性 (Isolation): 数据库支持多个事务并发, 隔离性可以防止事务交叉执行导致的不一致
    • 读未提交
    • 读提交
    • 可重复读
    • 串行化
  • 持久性 (Durability): 事务处理结束后, 对数据的修改时永久的

使用方法

  • start transaction; 开启
  • commit; 提交
  • rollback; 回滚

第一步: 开启事务, 执行操作

# alpha 对 bravo 转账 100
mysql> select * from balance;
+----+-------+-------+
| id | name | money |
+----+-------+-------+
| 1 | alpha | 1000 |
| 2 | bravo | 1000 |
+----+-------+-------+
2 rows in set (0.00 sec) # 开启事务
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec) mysql> update balance set money=1000-100 where name='alpha';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> update balance set money=1000+100 where name='bravo';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from balance;
+----+-------+-------+
| id | name | money |
+----+-------+-------+
| 1 | alpha | 900 |
| 2 | bravo | 1100 |
+----+-------+-------+
2 rows in set (0.00 sec)

第二步: 此时我们还未提交事物, 我们新开一个窗口, 查看一下balance表

mysql> select * from balance;
+----+-------+-------+
| id | name | money |
+----+-------+-------+
| 1 | alpha | 1000 |
| 2 | bravo | 1000 |
+----+-------+-------+
2 rows in set (0.00 sec)

第三步: 然后我们提交事物

mysql> commit;
Query OK, 0 rows affected (0.00 sec) mysql> select * from balance;
+----+-------+-------+
| id | name | money |
+----+-------+-------+
| 1 | alpha | 900 |
| 2 | bravo | 1100 |
+----+-------+-------+
2 rows in set (0.00 sec)

第四步: 在新的窗口查看balance表, 数据修改成功

mysql> select * from balance;
+----+-------+-------+
| id | name | money |
+----+-------+-------+
| 1 | alpha | 900 |
| 2 | bravo | 1100 |
+----+-------+-------+
2 rows in set (0.00 sec)

如果我们在第三步的时候不提交, 回滚一下事务

mysql> select * from balance;
+----+-------+-------+
| id | name | money |
+----+-------+-------+
| 1 | alpha | 1000 |
| 2 | bravo | 1000 |
+----+-------+-------+
2 rows in set (0.00 sec) # 开启事务
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec) mysql> update balance set money=1000-100 where name='alpha';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> update balance set money=1000+100 where name='bravo';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from balance;
+----+-------+-------+
| id | name | money |
+----+-------+-------+
| 1 | alpha | 900 |
| 2 | bravo | 1100 |
+----+-------+-------+
2 rows in set (0.00 sec) # 回滚事务
mysql> rollback;
Query OK, 0 rows affected (0.01 sec) # 数据没有被修改
mysql> select * from balance;
+----+-------+-------+
| id | name | money |
+----+-------+-------+
| 1 | alpha | 1000 |
| 2 | bravo | 1000 |
+----+-------+-------+
2 rows in set (0.00 sec)

存储引擎

  • InnoDB (MySQL默认)

  • MyISAM (我的阿萨姆?)

  • 区别

    • InnoDB支持事务
    • InnoDB支持行锁(并发), MyISAM只支持表锁

视图

基本概念

  • 根据select查询语句得到一个具有名称的动态数据集, 用户只要通过视图名称就可获取这个数据集

使用方法

  • 增加视图 create view 视图名 as select查询语句
  • 使用视图 (相当于一个表) select * from 视图名
  • 删除视图 drop view 视图名
mysql> select * from user_info;
+----+---------+----------+
| id | name | password |
+----+---------+----------+
| 1 | bigb | 111111 |
| 2 | blake | 222222 |
| 3 | black | 333333 |
| 4 | alpha | 111111 |
| 5 | bravo | 222222 |
| 6 | charlie | 333333 |
| 7 | delta | 111111 |
| 8 | echo | 222222 |
| 9 | foxtrot | 333333 |
+----+---------+----------+
9 rows in set (0.00 sec) mysql> select * from user_info where name='alpha';
+----+-------+----------+
| id | name | password |
+----+-------+----------+
| 4 | alpha | 111111 |
+----+-------+----------+
1 row in set (0.00 sec) # 创建视图
mysql> create view v1 as select * from user_info where name='alpha';
Query OK, 0 rows affected (0.01 sec) # 使用视图
mysql> select * from v1;
+----+-------+----------+
| id | name | password |
+----+-------+----------+
| 4 | alpha | 111111 |
+----+-------+----------+
1 row in set (0.00 sec) # 如果我们对原表记录进行了修改, 发现视图中的数据也进行了相应的修改, 因此通过视图得到是一个动态的数据集
mysql> update user_info set password='888888' where name='alpha';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from v1;
+----+-------+----------+
| id | name | password |
+----+-------+----------+
| 4 | alpha | 888888 |
+----+-------+----------+
1 row in set (0.00 sec) # 删除视图
mysql> drop view v1;
Query OK, 0 rows affected (0.00 sec)

触发器

基本概念

  • 对表1进行某些特定操作时会触发对表2的某些特定操作

使用方法

  • 创建触发器
delimiter 结束符号(自定义)
create trigger 触发器名 before/after 触发事件 on 表名 for each row
begin
触发器触发的内容;
end 结束符号 delimiter; # 将结束符号改回;
  • 例子: 实现对 t1 添加记录时 , 也向 t2 添加一条记录
# t1 和 t2 为两个空表
mysql> select * from t1;
Empty set (0.00 sec) mysql> select * from t2;
Empty set (0.00 sec) # 创建触发器
mysql> delimiter //
mysql> create trigger tri_nb after insert on t1 for each row
-> begin
-> insert into t2 (name) values ('bravo');
-> end //
Query OK, 0 rows affected (0.01 sec) mysql> delimiter ; # 对 t1 进行操作
mysql> insert into t1 (name) values ('alpha');
Query OK, 1 row affected (0.01 sec) mysql> select * from t1;
+----+-------+
| id | name |
+----+-------+
| 1 | alpha |
+----+-------+
1 row in set (0.00 sec) mysql> select * from t2;
+----+-------+
| id | name |
+----+-------+
| 1 | bravo |
+----+-------+
1 row in set (0.00 sec)

存储过程

基本概念

  • 对sql语句进行了封装, 方便后期调用, 相当于MySQL中的函数

使用方法

  • 创建
delimiter 结束符号

create procedure p1(IN 参数 int)  # IN表示传入参数, 参数类型为int
begin
sql语句;
end 结束符号 delimiter 结束符号
  • 使用

    • call p1(参数);
  • 删除

    • drop procedure p1;
  • 例子

+----+---------+----------+
| id | name | password |
+----+---------+----------+
| 1 | bigb | 111111 |
| 2 | blake | 222222 |
| 3 | black | 333333 |
| 4 | alpha | 888888 |
| 5 | bravo | 222222 |
| 6 | charlie | 333333 |
| 7 | delta | 111111 |
| 8 | echo | 222222 |
| 9 | foxtrot | 333333 |
+----+---------+----------+ # 创建
mysql> delimiter // mysql> create procedure p1(IN p_in int)
-> begin
-> select * from user_info where id = p_in;
-> end //
Query OK, 0 rows affected (0.01 sec) mysql> delimiter ; # 调用
mysql> call p1(3);
+----+-------+----------+
| id | name | password |
+----+-------+----------+
| 3 | black | 333333 |
+----+-------+---------+
1 row in set (0.00 sec)

数据备份

备份

  • 单库备份

    • mysqldump -u用户名 -p密码 数据库名 > 备份文件.sql
    • mysqldump -u用户名 -p密码 数据库名 表1 表2 > 备份文件.sql 对库下面的表进行备份
  • 多库备份 mysqldump -u用户名 -p密码 --databases 数据库1 数据库2 > 备份文件.sql
  • 备份所有 mysqldump -u用户名 -p密码 --all-databases > 备份文件.sql

导入

  • source D:\all.sql

函数

MySQL 05的更多相关文章

  1. PHP语言基础之MySql 05 By ACReaper

    PHP的基本语法学完后,我们马上学下PHP如何和MySql进行交互.PHP和MySql进行交互的API可以分为两类,一类是面向过程的,一类是面向对象的,面向对象的我们等复习完面向对象再介绍,现在先介绍 ...

  2. MySQL 05章_模糊查询和聚合函数

    在之前的查询都需要对查询的关机中进行“精确”.“完整”完整的输入才能查询相应的结果, 但在实际开发过程中,通常需要考虑用户可能不知道“精确”.“完整”的关键字, 那么就需要提供一种不太严格的查询方式, ...

  3. day48 Pyhton 数据库Mysql 05

    一内容回顾 insert insert into 表名 (字段名)  values (值) insert into 表名 values (有多少个字段写多少个值) insert into 表名 val ...

  4. MySQL实战 | 05 如何设计高性能的索引?

    原文链接:MySQL | 05 如何设计高性能的索引? 上回我们主要研究了为什么使用索引,以及索引的数据结构.今天带你了解如何设计高性能的索引. 其中,有这么一个点,说的是 InnoDB 引擎中使用的 ...

  5. ch4 MySQL 安全管理

    第 4 章 MySQL 安全管理 前言 对于任何一个企业来说,其数据库系统中所保存数据的安全性无疑是非常重要的,尤其是公司的有些商业数据,可能数据就是公司的根本,失去了数据的安全性,可能就是失去了公司 ...

  6. mysql迁移-----拷贝mysql目录/load data/mysqldump/into outfile

    摘要:本文简单介绍了mysql的三种备份,并解答了有一些实际备份中会遇到的问题.备份恢复有三种(除了用从库做备份之外), 直接拷贝文件,load data 和 mysqldump命令.少量数据使用my ...

  7. 第 4 章 MySQL 安全管理

    前言 对于任何一个企业来说,其数据库系统中所保存数据的安全性无疑是非常重要的,尤其是公司的有些商业数据,可能数据就是公司的根本,失去了数据的安全性,可能就是失去了公司的一切.本章将针对 MySQL 的 ...

  8. linux rpm方式安装mysql

    01.搜索 mysql linux 网盘地址    http://pan.baidu.com/s/1qYOC6cs 02.把下载好的mysql 使用 xftp传到 linux中 software 文件 ...

  9. MySQL性能调优与架构设计——第4章 MySQL安全管理

    第4章 MySQL安全管理 前言 对于任何一个企业来说,其数据库系统中所保存数据的安全性无疑是非常重要的,尤其是公司的有些商业数据,可能数据就是公司的根本,失去了数据的安全性,可能就是失去了公司的一切 ...

随机推荐

  1. 深入讲解 Laravel 的 IoC 服务容器

    众所周知,Laravel 控制反转 (IoC) / 依赖注入 (DI) 的功能非常强大.遗憾的是, 官方文档 并没有详细讲解它的所有功能,所以我决定自己实践一下,并整理成文.下面的代码是基于 Lara ...

  2. java编程思想第四版第九章习题

    第三题 package net.mindview.interfaces; abstract class Base{ public Base(){ print(); } abstract void pr ...

  3. Centos 7环境下修改主机名

    步骤如下: 一.首先把虚拟机打开,用root账户进行登录后打开终端 二.我们看到我们虚拟机名称是默认的主机名. 三.用vi编辑器编辑etc目录下的hostname文件,输入“vi /etc/hostn ...

  4. NetCore基于EasyNetQ的高级API使用RabbitMq

    一.消息队列 消息队列作为分布式系统中的重要组件,常用的有MSMQ,RabbitMq,Kafa,ActiveMQ,RocketMQ.至于各种消息队列的优缺点比较,在这里就不做扩展了,网上资源很多. 更 ...

  5. 力扣(LeetCode)猜数字大小 个人题解

    我们正在玩一个猜数字游戏. 游戏规则如下:我从 1 到 n 选择一个数字. 你需要猜我选择了哪个数字.每次你猜错了,我会告诉你这个数字是大了还是小了.你调用一个预先定义好的接口 guess(int n ...

  6. mysql定时任务(event事件)

    1.event事件 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器” 事件和触发器类似,都 ...

  7. 护网杯2019 mergeheap --pwn

    护网 又是签到 一天 这道题一开始 不懂得如何泄露 libc 信息,就蒙了  后来群里师傅也是刚刚好 做出 到这里 我就接着做了 . 先看下保护,发现  全开了 然后 就看下流程 大概 就是添加  c ...

  8. C博客作业05--2019-指针

    0.展示PTA总分 1.本章学习总结 1.1 学习内容总结 1.2 本章学习体会 2.PTA实验作业 2.16 -7 输出月份英文名 2.1.1 伪代码 char* getmonth(int n) { ...

  9. 【开发工具 - Git】之本地项目托管到远程仓库

    这里所说的“本地项目托管到远程仓库”,说的是:例如,我们在本地有一个写了很长时间的项目,现在想要托管到GitHub或码云上进行版本控制. 这个过程大致需要以下几个步骤: (1)在本地初始化Git项目本 ...

  10. 《手把手教你》系列练习篇之7-python+ selenium自动化测试 -压轴篇(详细教程)

    1. 简介 “压轴”原本是戏曲名词,指一场折子戏演出的倒数第二个剧目.在现代社会中有很多应用,比如“压轴戏”,但压轴也是人们知识的一个盲区.“压轴”本意是指倒数第二个节目,而不是人们常说的倒数第一个, ...