SQL基础—事务Transaction

1.什么是事务?为什么要用事务?


什么是事务?

一个事务是由一条或者多条sql语句构成,这一条或者多条sql语句要么全部执行成功,要么全部执行失败!

那为什么要使用事务呢???

举例:

银行转账!张三转10000块到李四的账户,这其实需要两条SQL语句:

  • 给张三的账户减去10000元;
  • 给李四的账户加上10000元。

如果在第一条SQL语句执行成功后,在执行第二条SQL语句之前,程序被中断了(可能是抛出了某个异常,也可能是其他什么原因),那么李四的账户没有加上10000元,而张三却减去了10000元。这肯定是不行的!

事务中的多个操作,要么完全成功,要么完全失败!不可能存在成功一半的情况!也就是说给张三的账户减去10000元如果成功了,那么给李四的账户加上10000元的操作也必须是成功的;否则给张三减去10000元,以及给李四加上10000元都是失败的!

2.事务的特性


2.1 事务的四大特性(ACID)

1.原子性(Atomicity):

  • 事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。

2.一致性(Consistency):

  • 事务执行前后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。

3.隔离性(Isolation):

  • 隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰

4.持久性(Durability):

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

2.2 数据库的并发访问问题

如果不考虑隔离性,事务存在3中并发访问问题:

1)脏读:一个事务读到了另一个事务未提交的数据

  • 未提交的数据很有可能会被回滚

2)不可重复读:一个事务读到了另一个事务已经提交(update)的数据。引发这个事务,在事务中的多次查询结果不一致。

  • 前后读取到的对应记录,其值不同(行级)

3)虚读 /幻读:一个事务读到了另一个事务已经提交(insert)的数据。导致这个事务,在事务中多次查询的结果不一致。

  • 前后查询到的记录数不同(表级)

2.3 数据库的隔离级别:解决问题

数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况:

1.read uncommitted 读未提交:一个事务读到另一个事务没有提交的数据。

  • a)存在:3个问题(脏读、不可重复读、虚读)
  • b)解决:0个问题

2.read committed 读已提交:一个事务读到另一个事务已经提交的数据。

  • a)存在:2个问题(不可重复读、虚读)。
  • b)解决:1个问题(脏读)

3.repeatable read可重复读:在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。

  • a)存在&#x
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值