数据库——事务

什么是事务?

一个事务其实就是一个完整的业务逻辑

答:事务是一组原子性的 SQL 查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行,也就是说事务内的语句要么全部执行成功,要么全部执行失败。

什么是完整的业务逻辑?

  • 假设从A账户向B账户转账100元,将A账户的钱减去100,将B账户的钱加100

以上的操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再分

1、只有DML(insert、delete、update)语句才有事务,其他的语句和事务无关

  • 只有这三个操作对数据库表的数据进行增删改,需要考虑安全问题

假设所有业务只需要一条DML语句就能完成,还需要事务机制吗?

正是因为做某件事的时候需要多条DML语句共同联合完成,所以才需要事务的存在;一条DML语句不需要事务

到底什么是事务?

本质上,一个事务其实就是多条DML语句同时成功,或者同时失败

事务是怎么做到同时成功同时失败的呢?

InnoDB存储引擎:提供一组用来记录事务性活动的日志文件

在事务的执行过程中,每一条DML语句的操作都会记录到事务性活动日志文件

在事务的执行过程中,可以提交事务,也可以回滚事务

  • 提交事务:清空事务性活动日志文件,将数据持久化到数据库表中,标志着事务的成功结束
  • 回滚事务:清空事务性活动日志文件,撤销所有的操作,事务结束,全部失败

如何提交事务?如何回滚事务?

提交事务:commit语句

回滚事务:rollback语句,回滚到上一次的提交点

事务:transaction

mysql默认情况下是什么样的事务行为?

自动提交,每执行一条DML语句提交一次(回滚无效)

关闭自动提交机制:

start transaction;

自动提交不符合开发习惯,为了保证数据的安全,所以需要使用事务


事务的基本特性?

事务四大特征:原子性,一致性,隔离性和持久性。ACID

  1. 原子性(Atomicity)

    一个事务在逻辑上是必须不可分割的最小工作单元,不可再分;

    一个原子事务要么完整执行,要么干脆不执行。这意味着,工作单元中的每项任务都必须正确执行。如果有任一任务执行失败,则整个工作单元或事务就会被终止。即此前对数据所作的任何修改都将被撤销。如果所有任务都被成功执行,事务就会被提交,即对数据所作的修改将会是永久性的。

  2. 一致性(Consistency)

    同一个事物中所有操作同时成功或者同时失败

    一致性代表了底层数据存储的完整性。它必须由事务系统和应用开发人员共同来保证。事务系统通过保证事务的原子性,隔离性和持久性来满足这一要求; 应用开发人员则需要保证数据库有适当的约束(主键,引用完整性等),并且工作单元中所实现的业务逻辑不会导致数据的不一致(即,数据预期所表达的现实业务情况不相一致)。例如,在一次转账过程中,从某一账户中扣除的金额必须与另一账户中存入的金额相等。支付宝账号100 你读到余额要取,有人向你转100 但是事物没提交(这时候你读到的余额应该是100,而不是200) 这种就是一致性

  3. 隔离性(Isolation)
    隔离性意味着事务必须在不干扰其他进程或事务的前提下独立执行。换言之,在事务或工作单元执行完毕之前,其所访问的数据不能受系统其他部分的影响

    针对并发事务而言,隔离性就是要隔离并发运行的多个事务之间的相互影响,一般来说一个事务所做的修改在最终提交以前,对其他事务是不可见的。

  4. 持久性(Durability)
    持久性表示在某个事务的执行过程中,对数据所作的所有改动都必须在事务成功结束前保存至某种物理存储设备。这样可以保证,所作的修改在任何系统瘫痪时不至于丢失。


事务并发执行会遇到的问题?

脏写

如果一个事务修改了另一个未提交事务修改过的数据,那就意味着发生了脏写。

A BEGIN
B BEGIN
B UPDATE
A UPDATE
A COMMIT
B ROLLBACK

A明明把数据更新了,也把事务提交了,但最后啥也没干。

脏写是非常严重的问题,我们常说的四种隔离级别都不会发生这种问题。

脏读

如果一个事务读到了另一个未提交事务修改过的数据,那就意味着发生了脏读。

A BEGIN
B BEGIN
B UPDATE
A SELECT(若此时读到了B更新的数据,但B还没有提交,就意味着发生了脏读)
A COMMIT
B ROLLBACK

事务A相当于读到了一个不存在的数据。

不可重复读

如果一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值,那就意味着发生了不可重复读。

每次读到的数据是真实的

幻读

如果一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来,那就意味着发生了幻读。

幻读强调的是一个事务按照某个相同条件多次读取记录时,后读取时读到了之前没有读到的记录。

这些问题的严重性是递减的。


对应的隔离级别可能会发生的问题

  • READ UNCOMMITTED:读未提交。(可能发生脏读、不可重复读、幻读)
  • READ COMMITTED:读已提交。(可能发生不可重复读、幻读)
  • REPEATABLE READ:可重复读。(可能发生幻读)
  • SERIALIZABLE:可串行化。(都不会发生)

今日推歌

-----《探窗》

她唱着他乡遇故知
一步一句是相思
台下人金榜正题名
不曾认台上旧相识
他说着洞房花烛时
众人贺佳人配才子
未听一句一叹戏里有情痴

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星回昭以烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值