【MySQL】事务

为什么需要事务

在一些复杂的数据库操作中, 需要同步地操作一些数据, 需要用到事务, 解决并发的问题. 例如银行的转账问题, 如果A向B的银行卡转账500元, 则后台数据库要执行

  • 查询A账户的余额大于500
  • A账户余额减去500
  • B账户余额加上500

这几部要么都成功, 要么都失败.

如果只成功第二条然而第三条失败, 则A的钱会不翼而飞.

事务的四个特性

1. 原子性

事务的执行被视为不可分割的最小单元, 事务的所有操作, 要么全部执行, 要么全部失败不回滚, 不会只执行一部分操作.

2.一致性

在事务的开始之前和事务结束之后, 数据库的完整性没有

破坏.

3. 隔离性

事务之间相互独立, 互不干扰,但同一时间只允许一个事务请求同一个数据, 隔离性防止多个事务并发执行而导致数据的不一致性. 隔离分四个级别读未提交(read uncommitted), 读提交(read committed), 可重复读(repeatable read)和串行化(serializable)

4.持久性

所有的操作一旦执行, 则会持久化到硬盘, 无法回滚.

并发的问题

脏读

事务A获取了事务B的数据, 事务B之后回滚, A所读到的数据就是脏数据

不可重复读

事务A多次读取同一数据, 但事务B中途提交修改了该数据, 会出现两次读取不一致的现象.

幻读

事务A获取一张表的所有列, 发现有n行, 之后将其打印, 但在这是事务B在该表中又插入一条数据, 这是A打印出来的数据行数为n+1行,与之前查询的不符, 感觉像出现了幻觉

不可重复与幻读的区别

不可重复主要侧重一条数据修改, 幻读侧重增加和删除一条数据.

不可重复侧重锁住满足条件的行, 而幻读需锁住锁住一张表

事务的隔离级别

读未提交(read uncommitted)

读提交(read committed)

可重复读(repeatable read)

串行化(serializable)

事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值