高性能mysql之事务的理解

acid只的是原子性,持久性,隔离性,持久性

原子性,

概念理解 : 事务代表的最小的执行单元,事务中操作要么同时发生,要么同时不发生,不会出现有些发生有些不发生的情况,

例子 : 银行转账,A账户转账到给B账户转账100,事务中的操作分两步, A账户减100,B账户加100, 这两步必定同时成功或失败

一致性

概念理解 : 事务完成前后,事务必须从同一个一致性变到另一个一致性,

例子 : 银行转账 , 账户A和账户B 互相转账 , 转账前总额1000 转账后总额也一定是 1000 , 这个在分布式系统中比较重要 ,

另一个例子 : 初始值为a = 0 有100 个事务, 每个事务中操作为 a++ ,则全部事务结束后 值为100 , 这也是一致性的一种体现,

隔离性

概念理解 : 两个事务互不影响

例子 : 银行转账, 事务甲 账户A给账户B转账, 事务乙 账户B 给账户C 转账, 事务甲成功与否都不会影响事务乙

持久性

概念理解 : 事务完成后, 其结果将被永久的保留

例子 : 银行转账, 账户A 给账户B 转账100 转账完成后, 其结果不会改变 , 这个比较理解,


acid是对数据库的要求, 但并不是每个数据库系统都会具备这些特性, 因为有性能的要求, 有些问题是可以容忍的, 但是有些问题要坚决避免, 下面对数据库关于事务的一些问题进行说明


脏读

概念理解 : 一个事务读取到了另一个事务未提交的数据

例子 : 银行转账,  事务甲 , 账户A给账户B 转账100 ,事务乙  B 查看自己的账户, 如果 事务甲为未提交的状态, 事务乙 显示了事务甲的数据, 即 账户B 上多了100 , B 以为钱已经到账了, 此时 事务甲回退, 事务甲失败, 转账未成功, 则B 蒙受损失

注意 : 脏读是要严格避免的

不可重复读

概念理解 : 一个事务多次查询操作,得到的数据(数据内容)不一致, 则为不可重复读

例子 : 查看余额, 事务甲开启, 发现余额为100 此时事务未提交, 过了几秒, 再次查看余额, 发现余额为 200 , 两次查看余额的数值不一致, 这就是不可重复读 ,

另一个例子 : 事务甲为查看数据库中所有用户, 发现两次查询时, 得到的数据发生了变化,

幻读

概念理解 : 一个事务多次查询操作,得到的数据(条数)不一致, 则为幻读

例子 : 查看银行交易记录 , 事务两次查询, 发现第二次查询比第一次查询多了一条记录, 则为幻读 ;

更新丢失

概念理解 : 两个事务同时更新操作, 其中一个事务把另一个已经提交的事务的数据覆盖了 , 则发生了更新丢失 , 更新丢失也是要严格避免的

例子 : 银行转账 , 事务甲, 账户A 给账户B 转账100  , 事务乙, 账户C 给账户B 转账200 , 事务甲提交后, 事务乙提交, 此时 账户B 上只多了 200 , 此时发生更新丢失, 事务乙把事务甲的数据覆盖了 ,


mysql的隔离级别

有四种,

读未提交, 什么都解决不了, 最不安全, 效率最高, 禁止使用,

不可重复读, 可以解决脏读, 效率比较高,

可重复读,  可以解决不可重复读, mysql默认隔离级别,  解决方式就是行锁,

串行化, 什么都能解决, 但是效率底下, 没有并发量, 解决幻读需要表锁,或间隙锁,





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值