前言: 由于大一学习数据库不扎实,学到后面有点吃力,所以回过头来认真学习一边,写一些学习总结,提醒自己。也要告诫读者,把基础打扎实。读者觉得有用的话可以
收藏点赞哦!
文章目录
- 事务的ACID原则
- 事务的创建
- 显式事务开启与结束
- 事务并发问题
- 脏读
- 不可重复读
- 幻读
- 数据库的隔离级别
- savepoint 的使用
事务的ACID原则
A : 原子性: 要么都成功,要么都失败。
C : 一致性:一个事务执行会使数据从一个一致状态到另一个一致状态。
I :隔离性:一个事务的执行不会受到其他事务的干扰。
D :持久性: 事务一旦提交,则会永久的改变数据库的数据。
事务的创建
事务的创建分为两类:隐式事务,显式事务。
- 隐式事务:事务没有明显的开启和结束的语句或标记。
- 像我们常见的 DML 语言,insert、update、delete语句,这些语句执行就相当于开启了事务。
SHOW VARIABLES LIKE 'autocommit'
结果:
Variable_name | Value |
autocommit | ON |
数据库默认开启了自动提交的功能。
- 显式事务:事务有明显的开启和结束的语句或标记。
- 前提: 必须先设置自动提交功能为禁用。
set autocommit=0; # 关闭事务自动提交的功能
SHOW VARIABLES LIKE 'autocommit' # 查看
结果:
Variable_name | Value |
autocommit | OFF |
注意点: 关闭自动提交功能只对当前会话有效,关闭数据库从新打开就失效了。
显式事务开启与结束
步骤1: 开启事务。
set autocommit=0;
start transaction; #(可选的)可以写也可以不写
步骤2: 编写事务中的sql语句。
语句一;
语句二;
语句三;
…
步骤3:结束事务。
commit; #提交事务
rollback; # 回滚事务。
事务并发问题
对于同时运行多个事务,当这些事务访问数据库中相同的数据
时,如果没有采用必要的隔离机制,就会导致各种并发问题。
脏读
对于两个事务 1 和 2 ,1 读取了已经被 2 更新但是没有提交
的字段,若2 回滚以后,1 读取的内容就是临时的且无效的。
不可重复读
对于两个事务 1 和 2 ,1 读取了表中的一个字段,然后 2 更新
了该字段之后,1 再次 读取同一个字段,值就不同了。
幻读
对于两个事务 1 和 2 ,1 读取了表中的一个字段,然后 2 在该表中插入
了一些新数据之后,1 再次 读取同一个表,就会多出几行。
数据库的隔离级别
数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响, 避免各种并发问题.
一个事务与其他事务隔离的程度称为隔离级别.
数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
read uncommitted | √ | √ | √ |
read commited | × | √ | √ |
repeatable read | × | × | √ |
serializable | × | × | × |
- Oracle 支持的 2 种事务隔离级别:READ COMMITED,
SERIALIZABLE。 Oracle 默认的事务隔离级别为: READ
COMMITED - Mysql 支持 4 种事务隔离级别. Mysql 默认的事务隔离级别
为: REPEATABLE READ
savepoint 的使用
只能搭配 rollback
示例:
set autocommit=0;
start transaction;
DELETE FROM boys WHERE id=1;
savepoint a; # 设置保存点
DELETE FROM boys WHERE id=2;
rollback to a; # 回滚到a, id=2 的信息没有删除,但是id=1 的已经删除
总结: 数据库这门语言呢,不难,但是要多练,没有捷径。读者觉得有用的话可以
收藏点赞
哦!