【数据库】事务(概念和特点)

一、 什么是事务

事务是在数据库中执行的一系列操作单元,这些操作要么全部成功提交,要么全部失败回滚。

二、事务的特点:

  • 原子性(Atomicity):事务是一个不可分割的操作单元,要么全部执行成功,要么全部执行失败。如果事务中的任何一部分操作失败,将回滚到事务开始前的状态,保证数据的完整性。
  • 一致性(Consistency):事务执行的结果,须使数据从一个一致性状态到另一个一致性状态
  • 隔离性(Isolation):事务的执行互不干扰,任何事务内部操作对其他事务都是隔离的。并发执行的多个事务之间应该互相隔离,以防止数据争用和不一致的问题。
  • 持久性(Durability):一旦事务提交成功,它对数据库的改变应永久保存,即使系统发生故障也不会丢失。数据库系统通过将事务的操作记录写入持久存储介质(如磁盘)来保证数据的持久性。

三、一个例子说明事物

假设有一个银行系统,其中有两个账户:账户A和账户B。现在有一个转账操作需要将一定金额从账户A转移到账户B。

在这个转账操作中,可以将其作为一个事务来处理。事务包含以下步骤:

  1. 开始事务。
  2. 从账户A扣除一定金额。
  3. 向账户B添加同样的金额。
  4. 提交事务。

如果在整个过程中没有出现错误,即成功执行了步骤 2 和步骤 3,并且事务成功提交,那么账户A和账户B的余额将会根据转账操作进行更新,保持总额不变。

然而,如果在执行过程中出现了错误,比如步骤 3 遇到了问题,无法向账户B添加金额,那么事务将会回滚(Rollback),取消之前的步骤,账户A的金额也不会被扣除。

四、事务的隔离性

  • 五种常见的并发异常
    • 第一类丢失更新、第二类丢失更新
    • 脏读、不可重复读、幻读
  • 常见的隔离级别
    • Read Uncommitted: 读取未提交的数据
    • Read Committed: 读取已提交的数据
    • Repeatable Read: 可重复读
    • Serializable: 串行化

4.1 五种并发异常

4.1.1 第一类丢失更新

某一个事务的回滚,导致另一个事务已更新的数据丢失。

在这里插入图片描述

4.1.2 第二类丢失更新

某一个事务的提交,导致另一个事务已更新的数据丢失。
在这里插入图片描述

4.1.3 脏读

某一个事务,读取了另外一个事务未提交的数据。
在这里插入图片描述

4.1.4 不可重复读

一个事务对同一个数据前后读取结果不一致。

时间事务A事物B
T1开始事务
T2开始事务
T3查询账户余额为1000
T4取款1000,存款余额为0
T5查询账户余额为0
4.1.5 幻读

某一个事务,对同一个表前后查询到的行数不一致。

时间事务A事物B
T1开始事务
T2开始事务
T3查询账户余额小于10的用户(10人)
T4新增一账户且余额小于10
T5查询账户余额小于10的用户(11人)

4.2 使用四种隔离级别去处理这五种并发异常

隔离级别第一类丢失更新脏读第二类丢失更新不可重复读幻读
读未提交的数据YYYYY
读已提交的数据YYY
可重复读Y
串行化
  1. 数据安全性极高:串行化
  2. 性能高:读已提交的数据

4.3 事务管理的实现机制

4.3.1 悲观锁(数据库自带的)

看待问题悲观:只要并发就一定有问题

  • 共享锁(S锁)
    • 事务A对数据加了S锁后,其他事物只能加S锁,不能加X锁。即只能读、不能写
  • 排他锁(X锁)
    • 事物A对数据加了X锁后,其他事物对该数据不能加S锁也不能加X锁。即不能读、不能写
4.3.2 乐观锁(自定义实现)

乐观看待问题:即使并发了,也不会有问题

  • 版本号、时间戳
    • 在更新数据前,检查版本号是否发生变化。若变化则放弃本次更新,否则跟新数据(版本号+1)。

4.4 Spring事务管理

  • 声明式事务(开发中常用)
    • 通过XML配置,声明某方法的事务特征;
    • 通过注解,声明某方法的事务特征。
  • 编程式事务
    • 通过Transaction Template管理事务,通过它执行数据库操作。
 /* propagation为传播机制
        A调B,对于B来说,A为当前事务(外部事物)
       1. REQUIRED: 如果存在当前事务,那就加入该事务;如果不存在,就创建新事务;
       2. REQUIRED_NEW:创建一个新事务,并且暂停当前事务;
       3. NESTED:如果当前存在事务,则嵌套在该事物中执行(可独立地提交和回滚);否则和REQUIRED一样
     */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关系数据库事务数据库操作的逻辑单位,它将一系列操作作为一个不可分割的工作单元进行处理。事务具有以下四个特性,通常称为ACID属性: 1. 原子性(Atomicity):事务中的操作要么全部执行成功,要么全部失败回滚,没有中间状态。 2. 一致性(Consistency):事务在执行前后,数据库的状态保持一致。事务的执行不会违反数据库的完整性约束。 3. 隔离性(Isolation):并发执行的多个事务之间应该相互隔离,每个事务都感觉不到其他事务的存在。 4. 持久性(Durability):事务一旦提交,其结果应该永久保存在数据库中,即使发生系统故障也不会丢失。 事务调度方法用于并发执行多个事务,保证事务之间的隔离性和一致性。以下是几种常见的事务调度方法: 1. 串行调度(Serial Schedule):事务按顺序一个接一个地执行,不存在并发执行的情况。确保了最高的隔离性和一致性,但并发性能较差。 2. 可串行化调度(Serializable Schedule):通过并发控制技术,使得并发执行的事务具有串行化的效果。一般使用封锁(Locking)技术来实现。 3. 时间戳调度(Timestamp Schedule):为每个事务分配一个唯一的时间戳,按照时间戳的顺序执行事务,确保事务之间的隔离性和一致性。 4. 优先级调度(Priority Schedule):为每个事务分配一个优先级,根据优先级来决定事务的执行顺序。 需要注意的是,事务调度方法的选择要根据具体的应用场景和需求来确定,不同的方法有不同的特点和适用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值