MySQL 05

事务

基本概念

  • 事务: 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

函数

猜你喜欢

转载自www.cnblogs.com/bigb/p/11779709.html