一、事务
1、数据是指对数据库执行一批操作,在同一个事务当中,这些操作最终要么全部执行成功,要么全部执行失败
2、在mysql中只有使用了Innodb数据库引擎的数据库或表才支持事务
3、如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态
①描述:实际情况与得到的结果一致
②描述:实际情况与得到的结果不一致
③描述:实际情况与结果不一致,然后回到原始状态
2、事务四大特性简称ACID
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要 么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,它对数据库中数据的改变就是永久的。
3、开启事务
事务处理的方式一 :
- 设置提交方式 :
select @@autocommit; # 表示自动提交
select @@autocommit=0; # 0表示手动提交
- 提交事务 : commit
- 回滚事务 : rollback
事务处理的方式二:
- 开启事务:start transaction /begin
- 提交事务:commit
- 回滚事务:rollback
select * from account;
select * from account;
MariaDB [jack韦]> create table account(id int primary key auto_increment,name varchar(10),money double(10,2) comment '余额'); Query OK, 0 rows affected (0.00 sec) MariaDB [jack韦]> insert into account(name,money) values('Lucy',2000),('jack',2000); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 MariaDB [jack韦]> select * from account; +----+------+---------+ | id | name | money | +----+------+---------+ | 1 | Lucy | 2000.00 | | 2 | jack | 2000.00 | +----+------+---------+ 2 rows in set (0.00 sec) 正常情况 --- 不使用事务 MariaDB [jack韦]> update account set money = money -1000 where name='Lucy'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 MariaDB [jack韦]> select * from account; +----+------+---------+ | id | name | money | +----+------+---------+ | 1 | Lucy | 1000.00 | | 2 | jack | 2000.00 | +----+------+---------+ 2 rows in set (0.00 sec) 开启事务 MariaDB [jack韦]> select @@autocommit; # 表示自动提交 +--------------+ | @@autocommit | +--------------+ | 1 | +--------------+ 1 row in set (0.00 sec) MariaDB [jack韦]> insert into account(name,money) values('tom',5000); Query OK, 1 row affected (0.00 sec) MariaDB [jack韦]> select * from account; +----+------+---------+ | id | name | money | +----+------+---------+ | 1 | Lucy | 1000.00 | | 2 | jack | 2000.00 | | 3 | tom | 5000.00 | +----+------+---------+ 3 rows in set (0.00 sec) MariaDB [jack韦]> begin; #开启事务 Query OK, 0 rows affected (0.00 sec) MariaDB [jack韦]> insert into account(name,money) values('xi',6000); Query OK, 1 row affected (0.00 sec) MariaDB [jack韦]> select * from account; +----+------+---------+ | id | name | money | +----+------+---------+ | 1 | Lucy | 1000.00 | | 2 | jack | 2000.00 | | 3 | tom | 5000.00 | | 4 | xi | 6000.00 | +----+------+---------+ 4 rows in set (0.00 sec) MariaDB [jack韦]> rollback ; #回滚 Query OK, 0 rows affected (0.01 sec) MariaDB [jack韦]> select * from account; +----+------+---------+ | id | name | money | +----+------+---------+ | 1 | Lucy | 1000.00 | | 2 | jack | 2000.00 | | 3 | tom | 5000.00 | +----+------+---------+ 3 rows in set (0.00 sec) MariaDB [jack韦]> commit ; #提交 Query OK, 0 rows affected (0.00 sec) MariaDB [jack韦]> select * from account; +----+------+---------+ | id | name | money | +----+------+---------+ | 1 | Lucy | 1000.00 | | 2 | jack | 2000.00 | | 3 | tom | 5000.00 | +----+------+---------+ 3 rows in set (0.00 sec) |
黄色:创建表语句,相当于题干
蓝色:不使用事务,而修改了表里的内容
粉色:表示用自动方式开启事务,让表中的内容有着回退的希望
绿色:如果表中内容有错,可以回到开启事务时的时候,也就是“begin”之前
褐色:提交了内容,这样就相当于错上加错,再也回不到从前
4、并发事务问题
①赃读:一个事务读到另外一个事务还没有提交的数据
②不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
③幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 "幻影"。
事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted) |
是 |
是 |
是 |
不可重复读(read-committed) |
否 |
是 |
是 |
可重复读(repeatable-read) |
否 |
否 |
是 |
串行化(serializable) |
否 |
否 |
否 |
数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上”串行化“进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对:不可重复读“和”幻读“并不敏感,可能更关心数据并发访问的能力。
二、视图
①定义视图
create view 视图的名字 as select 语句 |
MariaDB [jack韦]> create view account_view as (select * from account where name ='Lucy');
Query OK, 0 rows affected (0.01 sec)
②查看视图
show tables; |
show tables;
③使用视图
select * from 视图的名字 |
MariaDB [jack韦]> select * from account_view;
+----+------+--------+
| id | name | money |
+----+------+--------+
| 1 | Lucy | 500.00 |
+----+------+--------+
1 row in set (0.00 sec)
④修改视图
create or replace view 视图名 as (select [...] from [...]) |
MariaDB [jack韦]> create or replace view account_view as (select * from account);
Query OK, 0 rows affected (0.00 sec)
⑤删除视图
drop view 视图的名字 |
MariaDB [jack韦]> drop view account_view;
Query OK, 0 rows affected (0.00 sec)