MySQL事务

目录

事务处理语言TCL

事务简介

事务控制

并发事务的隔离挑战

事务的隔离级别

MySQL约束控制

非空约束 NOT NULL

主键约束 PRIMARY KEY

默认值约束 DEFAULT

唯一约束 UNIQUE

外键约束 FOREIGN KEY


事务处理语言TCL

事务简介

事务的特性:ACID

ACID属性是数据库事务处理的核心,它们共同确保了在并发和故障情况下,数据库能够保持数据的一致性和完整性。

  • A(Atomicity):原子性
    • 事务被视为最小单位,操作要么全部完成,要么全部不执行
    • 在执行过程中,如果发生故障,事务将被回滚到开始事务之前的状态。
  • C(Consistency):一致性
    • 事务必须确保数据库从一个一致的状态转换到另一个一致的状态
    • 一致性状态指的是数据库中的数据应该满足所有的完整性约束
  • I(Isolation):隔离性
    • 数据库系统提供一定的隔离级别,防止多个事务并发执行时相互干扰
    • 隔离性确保事务在并发环境中独立执行,不会相互冲突或产生不一致的结果
  • D(Durability):持久性
    • 一旦事务被提交,它对数据库的更改应该是永久的
    • 即使发生系统故障,提交事务发生的更改不会丢失

事务控制

事务的控制是通过一系列控制语句来完成的,代表事务的各个阶段。

语句说明
BEGIN开始一个新的事物
SAVEPOINT设置事物的保存点
COMMIT提交事务
ROLLBACK回滚当前事务到初始状态,撤销提交前的操作
ROLLBACK TO SAVEPOINT name回滚事务到指定保存点name,并撤销保存点后的操作
SET AUTOCOMMIT设置当前连接是否自动提交事务,1表示启用自动提交,0表示禁止自动提交
RELEASE SAVEPOINT释放保存点
SET TRANSACTION设置事务的隔离级别

 查看当前事务是否设置了自动提交:

select @@autocommit;

并发事务的隔离挑战

事务并发是指多个事务同时对一个数据进行操作。

 并发事务未进行隔离设置,会出现以下问题:

  • 脏读:一个事务读取到另一事务未提交的更新数据(读取到了未持久化的数据)
    • 说明:当一个事务正在访问数据,并且对事务进行了修改,而这个数据未提交到数据库中,另一个事务也在访问这个数据,读到了修改后的数据。
    • 例子:T1开启了一个长事务,在较早的时候删除了一条数据,此时T2查询数据库中的数据,就会少统计一条,此时T1进行回滚,T2再查询后发现前后数据不一致。
  • 不可重复度:同一事务中,多次读取同一事物返回的结果不同(在同一事务中多次读取同一数据得到了不同结果)
    • 说明:后续读取到的是另一事物已提交的更新数据
    • 例子:T1开启了一个长事务,在较早的时候读取了一个数据,此时T2更改了数据并提交,随后T1再次读取但获得了新版本的数据。
  • 幻读:同一事务中,以同样的条件进行范围查询,两次获得的数据数量不一致
    • 例子:T1先执行了一次查询,然后事务T2新插入一条数据,T1使用相同的查询对表进行检索时,会发现这条多出来的数据。
    • 与不可重复读的区别:幻读专指新插入的行。

事务的隔离级别

读未提交、读已提交、可重复读、可串行化

事务隔离级别与存在问题的关系
名称含义脏读不可重复读幻读
读未提交一个事务提交前,它的变更就已经能被其他事务看到
读已提交一个事务提交后,它的变更才能被其他事务看到
可重复读

未提交的事务的变更不能被其他事务看到,同时一次事务过程中多次读取同样记录的结果是一致的

可串行化当两个事务间存在读写冲突时,数据库通过加锁强制事务串行执行
  • 读未提交 READ-UNCOMMITED:隔离级别最弱,并发性最好。
  • 读已提交 READ COMMITED:是大部分数据库系统的默认级别,但MySQL不是。
  • 可重复读 REPEATABLE READ:MySQL中事务的默认隔离级别。可以理解为事务开始时对数据库拍了一个快照,后续操作都在快照的基础上进行,不会读取到别的事务的提交结果。
  • 可串行化 SERIALIZABLE:最高的隔离级别。两个事务存在读写冲突时,数据库通过加锁强制事务串行执行

MySQL约束控制

在表和字段上强制执行的数据检测规则,防止不规则的数据进入数据库

非空约束 NOT NULL

保证该字段不为空

NULL和" "的区别:

  • NULL:NULL表示缺失的或未知的数据。它不是任何类型的实例,也不占用内存空间
  • " ":表示一个已分配的对象,但其内容是空的。在字符串的上下文中,""是一个有效的字符串,只不过它的长度为零。

主键约束 PRIMARY KEY

保证该字段的值具有唯一性,且每张表只能有一个主键,默认非空

自增序列 auto_increment:当插入数据时,自增序列为null时,数据会自动+1。一张表有且只能有一个自增序列,一般搭配主键使用。

默认值约束 DEFAULT

保证该字段总会有值。

在插入数据时,即使不给字段指定值,会自动插入默认值。

唯一约束 UNIQUE

保证字段唯一性,每张表中可以有多个唯一约束

外键约束 FOREIGN KEY

限制两个表的关系,保证表中该字段的值来自关联表

MySQL 事务是指一组数据库操作,这些操作要么全部执行,要么全部不执行,其目的是保证在并发环境下,数据的一致性和完整性。MySQL 事务具有 ACID 性质,即原子性、一致性、隔离性和持久性。 MySQL 中使用事务需要使用 BEGIN、COMMIT 和 ROLLBACK 语句,其中 BEGIN 表示开启一个事务,COMMIT 表示提交事务,ROLLBACK 表示回滚事务事务的基本语法如下: ``` BEGIN; -- 执行一组数据库操作 COMMIT; -- 提交事务 -- 或者 ROLLBACK; -- 回滚事务 ``` 在 MySQL 中,事务的隔离级别分为四个等级,分别是 Read Uncommitted、Read Committed、Repeatable Read 和 Serializable。隔离级别越高,数据的一致性和完整性越高,但同时也会影响数据库的性能。 MySQL 事务的 ACID 性质有以下含义: 1. 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败回滚,不会只执行其中的一部分操作。 2. 一致性(Consistency):事务执行前后,数据库中的数据必须保持一致性状态,即满足数据库的约束条件和完整性规则。 3. 隔离性(Isolation):事务之间应该是相互隔离的,一个事务的执行不应该被其他事务干扰,保证事务之间的数据相互独立。 4. 持久性(Durability):事务提交后,对数据库的修改应该是永久性的,即使出现系统故障或电源故障,也不应该对数据产生影响。 总之,MySQL 事务是一组数据库操作,具有 ACID 性质,可以通过 BEGIN、COMMIT 和 ROLLBACK 语句来实现,隔离级别越高,数据的一致性和完整性越高,但同时也会影响数据库的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值