数据库篇(四)——事务

一、什么是事务?

事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
事务是由一组SQL语句组成的逻辑处理单元。

数据库正确执行的四个基本要素(事务的四个属性):

ACID:

  • 原子性:一个事务的所有操作,要么全部完成,要么全部不完成
  • 一致性:在事务开始和结束时,数据库中的数据保持一致的状态
  • 隔离性:一个事务的执行不能被其他事务所干扰
  • 持久性:一个事务对数据库的改变是永久性的,不会被回滚。

二、并发事务带来的问题:

  • 更新丢失:两个事务T1和T2读入同一数据并修改,T2提交的结果覆盖了T1提交的结果,导致T1的修改被丢失。
  • 脏读:事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某原因被撤回,这是T1修改的数据恢复原值,T2读到错误的数据,即为脏数据(不正确的数据)
  • 不可重复读:在一个事务内多次读同一个数据,在这个事务没有结束时,另外一个事务对数据进行修改,导致第一个事务两次读到的数据不一致。
  • 幻读:同不可重复读的条件,第二个事务对数据是新增或者删除,导致第一个事务两次读数据不一致。

如何解决并发问题?

避免不一致性的方法和技术就是并发控制。常用的技术是加锁,如乐观锁和悲观锁(详情见后面的整理)

三、数据库事务的隔离级别介绍

数据库提供了4中隔离级别(由低到高):
这四个级别可逐渐解决脏读、不可重复读和幻读的问题。
- 读未提交数据:读取未被其他事务提交的变更,可能有脏读、不可重复读和幻读的问题。比如:某时刻会话a修改了一个数据,但未提交,此时会话b读取了该数据,这时,会话a回滚了事务,导致不一致,就是脏读。
- 读已提交数据:允许事务读取已被其他事务提交的变更,可以避免脏读,可能有不可重复读和幻读的问题。比如:一个事务查询一个数据,得到1,另一个事务修改该数据为2,并提交了,此时第一个事务又要读取该数据,得到2,导致两次结果不同,这就是不可重复读
- 可重复读(MySQL默认的隔离级别):确保事务可以多次从一个字段中读取相同的值,在这个事务持续器件,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,可能会有幻读。
- 可串行化:所有事务都一个接一个地串行执行,可以避免脏读,不可重复读、幻读。

四、MySQL事务控制语句

BEGIN或START TRANSACTION:显示地开启一个事务;
COMMIT:提交事务,并使已对数据库进行的所有修改成为永久性的;
ROLLBACK:回滚会结束用户的事务,并撤销正在进行的而所有为提交的修改。

五、数据库怎么保证数据的一致性

事务、悲观锁、乐观锁

猜你喜欢

转载自blog.csdn.net/u010843421/article/details/81664308