MySQL事务

本文介绍了事务的基本概念,特别是在银行转账等场景中的应用。事务具有原子性、一致性、持久性和隔离性(ACID)四大特性,确保数据操作的完整性和一致性。在MySQL中,不同的事务隔离级别能解决脏读、不可重复读和幻读等问题,但并发执行事务可能会引发这些问题。文章还探讨了解决这些问题的方法,如加锁和设置不同的隔离级别。
摘要由CSDN通过智能技术生成

1.什么是事务?

1.1事务使用的场景

在我们的生活中,我们通常会遇到银行转账这样的场景:
在这里插入图片描述

若要把张三的前给李四转100,则需要两个sql操作
(1)把张三的余额-100;
(2)给李四的余额加上100;
在这个操作中,可能会出现极端的操作(若给张三的余额-100,此时程序崩溃了,此时张三的余额为900,李四的余额为500)。事务就是为了结局这种问题的。

1.2事务的概念

事务就是把若干个SQL语句给打包成一个整体,要么全部执行完,要不就一个都不执行,哪怕执行一半,中间出现差错了,数据库也能保证把已经改动过的数据给自动还原成最初的样子。这里的清理还原操作称为"回滚" roll back。

2.事务的(ACID)特性

2.1 ACID特性

  1. 原子性(最核心的特性)
    事务是数据库的逻辑工作单位,事务中包括的诸操作,要么都做,要么都不做。
  2. 一致性
    事务执行完毕之后,数据仍然是合理的(程序员手动定义的 约束)
  3. 持久性
    事务执行完毕之后,数据就存在磁盘上了,哪怕重启主机,数据也仍然存在。
  4. 事务的隔离性
    一个事务的执行不能被其他的事务干扰。即一个事务的内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能相互干扰。

2.2 mysql并发执行事务可能产生的问题

  1. 脏读
    一个事务A在修改数据,另外一个事务B直接就读取A正在修改的数据。此时B就读到了一个脏数据。因为此时B读到的数据很可能就在A的后续操作中又进行了修改,相当于B读到的数据只是一个“中间的状态”,读到这个中间的数据,就是脏数据,这个动作,就叫脏读。
    并发:事务A在修改数据,事务B直接读取事务A正在修改的数据就是“并发”的关系,事务A修改数据和事务B读取数据完全是不确定的,先后顺序没有任何限制。
    解决脏读的问题:给写操作加锁。
  2. 不可重复读
    事务A修改数据然后提交,提交完毕后事务B开始读取数据。事务B中包含了很多次的读操作。如果事务B两次读操作得到的结果不一样,就是不可重复读。不一样的原因就是事务A虽然把数据已经提交了,但是可能又执行了一次事务A,又把这个数据给修改了。
    事务B第一次读到的数据是事务A提交的,第二次读到的数据是事务A又提交了一次。
    解决不可重复读:给读操作也加所。
  3. 幻读
    事务B正在读取数据,事务A插入了新的数据(或者删除了某个数据),事务B两次读取的数据集的个数发生了变化。
    解决幻读:串行化:彻底的让事务之间串行执行,此时就没有涉及任何的并发的事情了,必须要第一个执行完,再执行第二个,第三个。

2.3 mysql中事务的隔离级别

一共有四种隔离级别:

  1. read uncommitted 没有做出任何隔离行的限制,三个问题都存在,执行效率最高。
  2. read committed 相当于进行了写加锁,并发程度降低了,隔离级别就提高了,此时脏读问题解决了,不可重复读和幻读仍然存在。
  3. repeatable read相当于读加锁,并发程度又降低了,隔离级别又提高了,此时脏读和不可重复读解决了。幻读仍然存在(mysql的默认隔离级别)。
  4. Serializable 串行化,并发程度最低,隔离级别最高,此时脏读,不可重复读,幻读都消失了,执行效率最低的方式。
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、付费专栏及课程。

余额充值