事务 总结

什么是事务

事务(Transaction)是数据库区别于文件系统的重要特性之一。

数据库引入事务的主要目的:事务会把数据库从一种抑制状态转换为另一种一致状态。在数据库提交工作时,这种机制能够保证在一组的sql语句要么都成功执行、要么都不执行。

事务的基本要素(ACID)

事务用来保证数据库的完整性

  • 原子性(atomicity):事务中所有操作要么全部成功,要么全部失败
  • 一致性(consistency):从一种状态转变为下一种一致状态。事务开始前和结束后,数据库的完整性约束没有被破坏。
  • 隔离性(isolation):一个事务的影响在提交前对其他事务都不可见
  • 持久性(Durability):一旦提交,结果就是永久性的。

InnoDB中的事务完全符合ACID的特性

数据库事务的隔离级别

数据库事务的隔离级别有4种,由低到高分别是:

  • 未提交读(Read uncommitted)
  • 已提交读(read committed)
  • 可重复读(repeatable read)
  • 可串行化(Serializable)

未提交 读(Read uncommitted)

允许脏读,就是一个事务可以读取另一个未提交事务的数据。

eg:

老板要给员工发工资,员工的工资是3000/月。但是发工资时老板不小心按错了数字,按成5000/月,但是该事务还没有提交,就在这时,员工去查看自己这个月的工资,发现(5000)比往常多了2千元,以为涨工资了非常高兴。

已提交读(read committed)

只能读取到已经提交的数据(就是事务要等另一个事物提交后才能读取数据)
eg:

小明拿着工资卡去超市购物(卡里当然是只有3000),当他卖单时(事务开启),收费系统事先检测到他的卡里有3000,就在这个时候!!小明的对象把卡里的钱全部转了出去,并提交事物(提交完成)。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了。

可重复读(repeatable read)

就是在开始读取数据(事物开启)时,不再允许修改操作。

eg:

小明拿着工资卡去超市购物(卡里当然是只有3000),当他卖单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3000。这个时候任何人不能转出金额了。接下来收费系统就可以扣款了。

可串行化(Serializable)

最高的事务隔离级别,在该级别下,事务串行化顺序执行,读写相互都会阻塞。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不用。

eg:

小明拿着工资卡去ATM机(卡里当然是只有3000),当他取钱时(事务开启),ATM查询到他的卡里有3000。这个时候在向卡里存200。此时只有当查的事物完成时,存的事物才会执行。

总结

简单来说: 事物就是在数据库提交工作时,要么所有修改都保存,要么所有修改都不保存。

作者:潘佳琦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗伯特巴灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值