【数据库】事务

1.事务

事务:逻辑上的一组操作,组成这组操作的各个单元,要成功都成功,要失败均失败,不允许有中间操作。

1.1 操作

BEGIN:开启事务 start transaction
COMMIT:提交事务 commit即是全部成功
ROLLBACK:回滚事务rollback即是全部失败

手动回滚:
在这里插入图片描述

2.事务存在的目的

1.为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。

2.当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

当一个事务被提交给了DBMS(数据库管理系统),则DBMS需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态(要么全执行,要么全都不执行);同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。

但在现实情况下,失败的风险很高。在一个数据库事务的执行过程中,有可能会遇上事务操作失败、数据库系统/操作系统失败,甚至是存储介质失败等情况。这便需要DBMS对一个执行失败的事务执行恢复操作,将其数据库状态恢复到一致状态(数据的一致性得到保证的状态)。为了实现将数据库状态恢复到一致状态的功能,DBMS通常需要维护事务日志以追踪事务中所有影响数据库数据的操作。

一个数据库事务通常包含对数据库进行读或写的一个操作序列。

3.事务四大特性ACID

原子性(Atomicity):不可分割的最小操作单位。事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么一个都不执行

一致性(Consistency):事务执行前后,数据要处于一种合法的情况。事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。事务内部操作和其他事务的内部操作是相互隔离的(没有影响的)。隔离性就是描述并发过程中对应的一些问题。

持久性(Durability):当事务提交或回滚后,他对数据库的修改应该是永久保存的

案例: A 向 B 转钱

1、原子性:如果执行过程中,假设第一步完成(A账户扣除转账数),出现网络错误或数据库崩了,可以通过回滚事务使转账操作过程全部失败,A和B账户余额不会改变
2、一致性:转账有隐含条件,1)转账之后和转账之前,保证A,B的金额正确 2)金额不能未负 3)……
3、持久性:转账完成后 A,B 账户金额保持不变。
4、隔离性:保证A向B转账并发执行不会出错。

3.1 解释隔离性

假设A(5000)向B(1000)转账1000,并发执行两次。当第一次转账时,A 5000-1000 在这个计算未生效之前,此时第二个事务也需要读取 A 账户余额,为 5000。两个任务提交完毕,A 账户余额为 4000 ,发生错误!!!

为什么并发编程会导致上述问题?
答:多个任务并发执行时,执行任务一执行多少代码会切换到任务二,而任务二执行多少代码切换回任务一也是不可控的 ==> 抢占式执行

由于并发编程太难了~~
1)有些语言不支持并发(或者说“假的”并发),eg:JavaScript中提供 Promise编程模型。
2)Go语言,简单处理并发。

为什么要用并发编程?
并发能提高程序的执行效率,如果在不影响数据正确性的情况下,还是希望能尽可能的让多个操作(事务)并发执行。

并发操作数据库可能带来什么问题?
1)脏读。为了避免脏读,在写操作的时候“加锁”(提高了隔离性,降低了并发性)。
2)不可重复读,同一个事务内读取两次数据结果不一样。为了避免不可重复读,在读操作时“加锁”,即读时不能修改(隔离性进一步提高了,降低了并发性)。
3)幻读,同一个事务内多次查询的结果集不一样。上面只是给读加锁,例如多了一个类(表)或少了一个类(表),再次查询结果集中数目发生变化,为了避免幻读,完全“串行化”(隔离性最高,并发性最低)。

3.2 MySQL数据库中的隔离级别

实际中放弃了部分隔离性来追求效率。事务隔离级别可

1.读未提交(Read Uncommitted),允许读到其他人未提交的事务数据,并发性最高,隔离性最低,会产生脏读问题。

2.读已提交(Read Committed), 只允许读到其他人提交过的数据,读操作加锁,能避免脏读,提高了隔离性,降低了并发性,但存在不可重复读问题·。

3.可重复读(Read Repeat),只会读到我进入事务时,数据的快照(中间数据的修改我看不到),读写均加锁,能避免不可重复读,进一步提高隔离性,存在幻读问题(默认隔离级别)。

4.串行化(Serialization),排队提交事务,避免幻读,隔离程度最高,并发性最低。

     在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.思考

事务如何实现?

分布式系统中如果实现事务?

跨行转账?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值