Java后台开发面试经验(三)

感谢牛客网网友提供的面试经验!

1. 事务的四种特性?

  • 原子性(Atomicity):事务作为一个整体被执行 ,要么全部执行,要么全部不执行;
  • 一致性(Consistency):保证数据库状态从一个一致状态转变为另一个一致状态;
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行;
  • 持久性(Durability):一个事务一旦提交,对数据库的修改应该永久保存

事务是数据库的概念:园艺搁池

2. 如果不做控制,多个事务并发操作数据库会产生哪些问题吗?

  • 更新丢失:两个不同事务同时获得相同数据,然后在各自事务中同时修改了该数据,那么先提交的事务更新会被后提交事务的更新给覆盖掉,这种情况先提交的事务所做的更新就被覆盖,导致数据更新丢失。
  • 脏读:事务A读取了事务B未提交的数据,由于事务B回滚,导致了事务A的数据不一致,结果事务A出现了脏读;
  • 不可重复读:一个事务在自己没有更新数据库数据的情况,同一个查询操作执行两次或多次得到的结果数值不同,因为别的事务更新了该数据,并且提交了事务。
  • 幻读:事务A读的时候读出了N条记录,事务B在事务A执行的过程中增加 了1条,事务A再读的时候就变成了N+1条,这种情况就叫做幻读。

更脏不换

3. MySQL数据库事务的隔离级别有哪些?

图片来源:https://www.cnblogs.com/catmelo/p/8878961.html
Java后台开发面试经验(三)

  • 读未提交(Read Uncommitted):不允许更新丢失,允许脏读取。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据
  • 读已提交(Read Committed):允许不可重复读取,但不允许脏读取读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
  • 可重复读(Repeatable Read):禁止不可重复读取脏读取,但是有时可能出现幻读读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务
  • 序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,只有当事务A的写操作执行完之后,事务B才能进行写操作,但是读操作是可以正常进行的

4. MySQL中的锁机制?

MySQL数据库的锁分为表级锁行级锁。从数据库的角度看,行级锁又可以分为独占锁共享锁

  • 独占锁(排他锁),也称X锁(Exclusive Lock):
    独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受。执行数据更新命令,即INSERT、UPDATE 或DELETE 命令时,MySQL会自动使用独占锁。但当对象上有其它锁存在时,无法对其加独占锁。独占锁一直到事务结束才能被释放。

在select命令中使用独占锁的SQL语句为:select … for update;

  • 共享锁,也叫S锁(Shared Lock):
    共享锁顾名思义,那就是其锁定的资源可以被其它用户读取,但其它用户不能修改

如果在select查询语句中要手动加入共享锁,那么对应的SQL语句为:select … lock in share mode