一、事务
事务就是一组DML(数据操作)语句,这些语句在逻辑上存在相关性,要么全部执行成功,要么全部失败,是一个整体。
1、事务的基本操作:
-
开始一个事务:start transaction
-
创建一个保存点:savepoint 保存点名;
-
回到保存点:rollback to 保存点名。
2、事务操作注意事项:
-
没有设置保存点,也可以回滚。只能回滚到事务的开始,直接使用rollback(前提是事务还没有提交)。
-
事务提交(commit)后不可以回滚
-
InnoDB支持事务,而MyISAM不支持事务
3、无隔离会产生以下问题:
- 更新丢失:两个事务同时修改一个数据,一个事务的更新覆盖了另外一个事务的更新结果。
-
脏读:一个事务对数据修改后还没有提交,此时另外的事务读取了这个数据。
-
不可重复读:在同一事务中多次读取同一数据得到不同结果,这可能是读取过程中有另外的事务修改了数据。
-
幻读:第一个事务对涉及全表的数据进行修改,此时,另外的事务也修改表中的数据(如插入一行新数据),就会导致第一个事务操作完发现还有未修改的,就好像发生幻觉一样。
4、事务的隔离级别(4种)
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
读未提交(read uncommited) | √ | √ | √ | 不加锁 |
读已提交(read commited) | X | √ | √ | 不加锁 |
可重复读(repeatable read) | X | X | √ | 不加锁 |
可串行化(serializable) | X | X | X | 加锁 |
- 对号(√)表示会出现的情况,错号(X)表示不会出现的情况。
- MySQL中默认的隔离级别是可重复读。
5、事务的ACID特性
- 原子性(Atomicity):事务是应用中最小的执行单位,要么全部成功,要不失败回滚,对数据库不能产生影响。
- 一致性(Consistency):事务执行的结果,是使数据库从一个一致性状态到另外一个一致性状态。
- 隔离性(isolation):各个事务的执行互不干扰,任意一个事务的内部操作对其他并发事务都是隔离的。
- 持久性(Durability):一个事务一旦提交,对数据库所做的改变是永久的
二、数据库内连、外连
表的连接可分为内连接和外连接,其中外连又分为左外连接和右外连接。
下面通过创建一张简单student(id int, name varchar(20))表,一张score(id int, sum double)来具体展示。
1、内连接
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件
2、左外连接
联合查询中左表完全显示,右表不足的地方全部为null。
select 字段名 from 表名1 left join 表名2 on 连接条件
3、右外连接
联合查询中右表完全显示,左表不足的地方全部为null。
select 字段名 from 表名1 right join 表名2 on 连接条件