事务管理竟然这么好理解

带你了解什么是事务



前言

简简单单,带你清楚了解事务。


一、事务是什么?

事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作,要么全部执行,要么全部放弃。 通俗上讲就是,花钱买东西,支付金额后,你将获得商品,这个过程必须完整完成,如果付了钱没得到商品,就应该把钱退给你。

二、事务的特性(ACID)?

1、原子性(Atomicity): 事务中所有操作是不可再分割的原子单元。事务中所有操作要么都执行成功,要么都执行失败。

2、一致性(Consistency): 事务执行后,数据库状态与其他业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账户余额之和应该保持不变。

3、隔离性(Isolation): 隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会互相干扰。

4、持久性(Durability): 一旦事务提交成功,事务中所有的数据操作都必须被持久化保存到数据库中,即使提交事务后,数据库崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。


三、深入事务的隔离性?

  • 常见的并发异常
    第一类丢失更新:(某一个事物的回滚,导致另外一个数据已更新的诗句丢失了)
    可以发现事务二更新完数据应该为9,但是因为事务一的回滚会变成10
    在这里插入图片描述

    第二类丢失更新:(某一个事物的提交,导致另外一个数据已更新的诗句丢失了)
    可以发现事务二更新完数据应该为9,但是因为事务一的提交会变成11
    在这里插入图片描述

    脏读:(某一事务读取了另一事务未提交的数据)
    可以发现事务二读取到N=11,但是因为事务一回滚了,N=10,所以失误而事务二度读的不存在,是个脏数据。在这里插入图片描述

    不可重复读:(某一事务,对同一数据前后读取不一致)
    如再一次操作中,事务二要读取两次N,第一次N=10,但是在这短暂的期间,事务一提交更改了N,导致第二次读取到的N值发生了变换。在这里插入图片描述

    幻读:(某一事务对前后查询的表的行数不一致)
    如再一次操作中,事务二要查询两次记录,第一次记录为3条,但是在这短暂的期间,事务一提交插入了一条,导致第二次读取到的记录数目发生了变换。
    在这里插入图片描述

  • 常见的事务隔离级别
    读未提交(read-uncommitted)所有问题都为解决,换来的是效率极高
    读已提交(read-committed)
    可重复读(repeatable-read)
    串行化(serializable)可以处理所有问题,但是代价大,效率低

所以常用中间哪两种
常见数据库默认隔离级别:
MYSQL:默认隔离界别 可重复读
Oracle: 默认隔离界别 读已提交
Sqlsever: 默认隔离界别 读已提交
N 代表不会出现此类情况
Y 则会出现这类问题

在这里插入图片描述

四、这些是如何实现的呢?

实现机制
共享锁:也叫读锁,就是假如我在看房,我就加个读锁此时自己可以看,别人也可以看,不冲突。
排他锁:也叫写锁,就是加入我在入住这间房子,就加一个写锁,此时别人就不能看房和入住了。

  • 悲观锁(数据库)
    共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。

     事务A对某数据加了共享锁后,其他事务只能对该数据加共享锁,但不能加排他锁。
    

    排他锁(X锁):用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。

     事务A对某数据加了排他锁后,其他事务对该数据,既不能加共享锁,也不能加排他锁。
    
  • 乐观锁(需要自定义)

     版本号  、时间戳等
     在更新数据前,检出版本号是否发生了变化,若变化则取消本次更新,否则就更新数据(版本号+1)
    

总结

本文内容只是浅显的了解,写得不好的还请见谅,我们一起努力加油哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值