【数据库面试题05】什么是事务?

1 数据库事务的概念

数据库事务(Transaction)包含了一组相关的SQL语句,它们在业务逻辑上组成一个原子单元。

数据库必须保证事务中的所有操作全部成功,或者全部撤销

2 数据库事务ACID属性

数据库中的事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)以及持久性(Durability)。

  • 原子性:一个事务中的操作要么全部成功,要么全部失败。
  • 一致性:事务在开始之前数据库是一个一致的状态,事务结束之后数据库仍然处于一个一致的状态。
    • 原子性、隔离性、持久性都是为了保证数据库的一致性。
  • 隔离性:与并发事务有关。一个事务的修改在提交之前对其他的事务不可见,多个事务之间互相隔离。SQL标准定义了4种不同的事务隔离级别。
  • 持久性:已经提交的事务必须永久生效,即使发生了断电、系统崩溃等故障,数据库也不会丢失数据。

3 数据库事务常用的操作

  • BEGIN :开始一个新事务,BEGIN以后的操作都会在同一个事务中进行,它们是一个整体。
  • COMMIT :提交一个事务,COMMIT到上一个BEGIN之间的操作是一个整体的事务。
    • MySQL中由于autocommit 这个变量的默认值为ON,所以会默认帮我们自动提交一个事务。
    • SHOW variables LIKE 'autocommit';
  • ROLLBACK :回滚整个事务,ROLLBACK到上一个BEGIN之间的操作都会被回滚,不会被执行。
  • SAVEPOINT :事务保存点,可以结合ROLLBACK一起使用,ROLLBACK TO savepoint名 可以回滚到”savepoint名“处
    • “savepoint名”到ROLLBACK之间的操作:被回滚,不会执行
    • “savepoint名”之前的操作:会执行

4 并发问题

多个用户同时访问相同的数据时,例如:账户A和账户C同时给账户B转账,可能会带来以下问题:

  • 脏读(Dirty Read):当一个事务允许读取另一个事务修改但未提交的数据时,就可能发生脏读。
  • 不可重复读(Unrepeatable Read):一个事务读取某条记录之后,该数据被另一个事务修改并提交,当该事务再次读取相同记录时结果发生了变化
    • 值发生变换
  • 幻读(Phantom Read):一个事务第一次读取数据后,另一个事务增加或者删除了某些记录,导致该事务再次读取时返回结果的数量发生了变化
    • 数量发生变化
  • 更新丢失(Lost Update):
    • CASE 1:当两个事务更新相同的数据时,如果第一个事务被提交,然后第二个事务被撤销,导致第一个事务的更新也被撤销。
    • CASE 2:当两个事务同时读取某个记录之后分别进行修改提交,导致先提交的事务的修改丢失。

可以设置隔离级别来避免这些问题。

5 隔离级别

SQL标准定义了四种不同事务的隔离级别,它们(从低到高排列)可能产生的问题如下:

 

版权声明:
作者:jackqiang
链接:http://www.jackqiang.com/interview/interview-db/1977/db_tx/
来源:JackQiang's
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录