一、事务

1、数据是指对数据库执行一批操作,在同一个事务当中,这些操作最终要么全部执行成功,要么全部执行失败
2、在mysql中只有使用了Innodb数据库引擎的数据库或表才支持事务
3、如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态
①描述:实际情况与得到的结果一致

mysql之任务视图_数据库

②描述:实际情况与得到的结果不一致

mysql之任务视图_数据_02


③描述:实际情况与结果不一致,然后回到原始状态

mysql之任务视图_不可重复读_03


2、事务四大特性简称ACID

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要 么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中数据的改变就是永久的。


3、开启事务

事务处理的方式一 :

  1. 设置提交方式

select @@autocommit; # 表示自动提交

select @@autocommit=0; # 0表示手动提交

  1. 提交事务commit
  2. 回滚事务 : rollback


事务处理的方式二:

  1. 开启事务:start transaction /begin
  2. 提交事务:commit
  3. 回滚事务: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、并发事务问题

①赃读:一个事务读到另外一个事务还没有提交的数据

mysql之任务视图_不可重复读_04

②不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。

mysql之任务视图_数据库_05

③幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 "幻影"。

mysql之任务视图_数据库_06


事务隔离级别 脏读 不可重复读 幻读


读未提交(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)