前言: 由于大一学习数据库不扎实,学到后面有点吃力,所以回过头来认真学习一边,写一些学习总结,提醒自己。也要告诫读者,把基础打扎实。读者觉得有用的话可以收藏点赞哦!


文章目录

  • 事务的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 再次 读取同一个表,就会多出几行。

数据库的隔离级别

数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响, 避免各种并发问题.

一个事务与其他事务隔离的程度称为隔离级别.

数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。

什么是mysql隐式提交_什么是mysql隐式提交

事务隔离级别

脏读

不可重复读

幻读

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 的已经删除

总结: 数据库这门语言呢,不难,但是要多练,没有捷径。读者觉得有用的话可以收藏点赞哦!