事务管理

事务定义

作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行

事务作用

事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性

特性

原子性(Atomicity)

事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做

一致性(Consistency)

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的

隔离性(Isolation)

事务在执行期间不应该受到其他事务的影响
持久性(Durability)
事务执行成功,那么数据应该持久保存到磁盘上

安全隐患

脏读

一个事务读到另外一个事务还未提交的数据

不可重复读

一个事务读到了另外一个事务提交的数据 ,造成了前后两次查询结果不一致

幻读

一个事务读到了另一个事务已提交的插入的数据,导致多次查询结果不一致

丢失更新

悲观锁

指事务在一开始就认为丢失更新一定会发生, 这是一件很悲观的事情。 具体操作步骤如下:
1. 所有事务在执行操作前,先查询一次数据, 查询语句如下:select * from student for update ; 后面的for update 其实是数据库锁机制 、 一种排他锁。
2. 哪个事务先执行这个语句, 哪个事务就持有了这把锁, 可以查询出来数据, 后面的事务再执行这条语句,不会有任何数据显示,就只能等着。
3. 一直等到前面的那个事务提交数据后, 后面的事务数据才会出来,那么才可以往下接着操作。

乐观锁

乐观锁是指,从来不会觉得丢失更新会发生。要求程序员在数据库中添加字段,然后在后续更新的时候,对该字段进行判定比对, 如果一致才允许更新。例子如下:

  1. 数据库表中,额外添加了一个version字段, 用于记录版本, 默认从0 开始, 只要有针对表中数据进行修改的,那么version就+1.
  2. 开启A事务, 然后开启B事务
  3. A 先执行数据库表操作。 因为以前都没有人修改过。 所以是允许A事务修改数据库的,但是修改完毕,就把version的值变成 1 了
  4. B事务, 这时候如果想执行修改,那么是不允许修改的。 因为B事务以前是没有查询过数据库内容的,所以它认为数据库版本还是0 。 但是数据库的版本经过A修改,已经是1了。所以这时候不允许修改, 要求其重新查询 。
  5. B重新查询后, 将会得到version 为 1的数据,这份数据就是之前A 事务修改的数据了, B 在进行修改,也是在A的基础上修改的。 所以就不会有丢失更新的情况出现了

乐观锁的机制 ,其实是通过比对版本或者比对字段的方式来实现的, 这与大家在未来的学习中,或者在工作中,使用到的版本控制软件【SVN , GIT】机制是一样的

事务的隔离级别

Read Uncommitted【读未提交】

优点

效率最高

缺点

  • 脏读
  • 不可重复读
  • 幻读

Read Committed 【读已提交】

优点

解决 脏读

缺点

  • 不可重复读
  • 幻读

Repeatable Read 【重复读】

优点

解决 脏读
解决 不可重复读

缺点

幻读

Serializable 【可串行化】

优点

解决 脏读
解决 不可重复读
解决 幻读

缺点

串行,效率低

性能

读未提交>读已提交>重复读>可串行化

这里写图片描述

Xmind格式思维导图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值