【Java面试】数据库原理总结

1. 什么是事务?ACID是什么?

事务(Transaction)是指一组相关的操作,这些操作被视为一个单独的、不可分割的工作单元。事务在数据库管理系统中起到重要的作用,可以确保数据的完整性和一致性。通过使用事务,可以将多个数据库操作视为一个逻辑单元,从而保证数据库的可靠性和稳定性。例如,在银行转账过程中,转出金额和转入金额必须同时被更新,以确保账户余额的一致性。如果其中一个操作失败,整个事务将被回滚,以防止不正确的数据状态。

ACID分别表示原子性、一致性、隔离性和持久性:

  • Atomicity(原子性):事务是一个原子操作,要么全部执行成功,要么全部不执行,不会部分执行。如果其中任何一个操作失败,整个事务将被回滚到初始状态。
  • Consistency(一致性):事务的执行使数据库从一个一致状态转移到另一个一致状态。事务在开始和结束时必须满足数据库的完整性约束,确保数据的有效性。
  • Isolation(隔离性):事务的执行应该与其他并发事务隔离开来,使得每个事务感觉就像在独立地运行。并发事务之间的相互影响应该被隔离,以防止数据的不一致性。
  • Durability(持久性):一旦事务被提交,其结果应该是永久性的,即使在系统故障的情况下也不应该丢失。

2. 数据库中并发一致性问题?

以下是常见的并发一致性问题:

  • 脏读(Dirty Read):一个事务读取了另一个事务尚未提交的数据,如果未提交的事务回滚,则读取到的数据是无效的。T1 和 T2 是两个事务,T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。

  • 不可重复读(Non-repeatable Read):在同一个事务中,多次读取同一数据,但在读取过程中其他事务修改了该数据,导致多次读取的结果不一致。T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。

  • 幻读(Phantom Read):在同一个事务中,多次执行相同的查询,但在查询过程中其他事务插入或删除了符合查询条件的数据,导致多次查询的结果不一致。T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。

3. 事务的隔离等级?

  • 读未提交(Read Uncommitted):最低级别的隔离级别,事务可以读取其他事务尚未提交的数据。这种隔离级别存在脏读、不可重复读和幻读的问题。
  • 读提交(Read Committed):事务只能读取其他已提交的数据,保证了一个事务读取到的数据是一致的。但在同一个事务中,多次读取同一数据可能会得到不同的结果,存在不可重复读和幻读的问题。
  • 可重复读(Repeatable Read):事务开始时创建一个一致性快照,事务期间读取的数据都是基于这个快照的。其他事务对数据的修改不可见,解决了不可重复读的问题。但仍可能存在幻读的问题。
  • 串行化(Serializable):最高级别的隔离级别,通过对事务进行串行执行,完全隔离了并发事务之间的影响。可以避免脏读、不可重复读和幻读的问题,但会降低并发性能。

4. ACID靠什么保证的呢?

数据库通过使用日志和事务日志来记录事务的操作,以便在发生故障时进行回滚和恢复,以此来保证原子性

数据库通过应用事务规则和约束来确保数据的一致性

数据库通过实现不同的事务隔离级别(如读未提交、读提交、可重复读和串行化)来提供隔离性

数据库通过使用日志和写入操作的持久化存储来实现持久性

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天`南

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

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

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

打赏作者

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

抵扣说明:

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

余额充值