1 为什么会有数据库事务

数据库在没有事务的情况下进行读写,可能出现脏读、不可重复读与幻读三种异常,而为了解决这三种异常,便引出了数据库事务,首先我们来看看三种异常发生的场景。

1.1 脏读

在没有事务的情况下,当一个任务先对数据库进行了写操作,然后因为某种原因导致该次写入操作无效,又进行了撤销操作,而在这期间别的任务读取了其中的数据,这时别的线程所读取的数据其实是无效数据,这便是脏读。

简而言之就是一个事务读取了另一个事务未提交的数据

1.2 不可重复读

在没有事务的情况下,当一个任务先读取了某一个数据,在运行的过程中,需要再次读取该数据,而在第二次读取之前,有别的任务对该数据进行了写操作,这便使得两次读取的数据不一致,这便是不可重复读。

简而言之就是一个事务在多次查询同一条数据时得到的结果不一致

1.3 幻读

在没有事务的情况下,当一个任务先读取了数据库中某个范围内的多行数据,而当之后再次读取该范围内的数据时,查询出的记录数变多或变少了,这便是幻读。

2 怎么解决上述问题

数据库通过引入事务的隔离级别来解决该问题,其中 mysql 数据库提供了四种隔离级别

  • Read uncommitted 读未提交:这种隔离级别解决不了任何问题
  • Read committed 读已提交:可避免脏读的发生
  • Repeatable read 可重复读:可避免脏读、不可重复读的发生
  • Serializable 串行化:可避免脏读、不可重复读和幻读的发生

对于这几种隔离级别,解决的问题越多,性能也就越差。