数据库事务

  1. 什么是事务

-     在数据库中,一项事务(Transaction)是由一条或多条操作数据库的SQL语句组成的一个不可分割的工作单元。当事务中的所有操作都正常完成时,整个事务才能被提交到数据库中,如果有一项没有完成,则整个事务会被回滚。

-     事务可以理解为:逻辑上的一组操作,组成这组操作的各个单元,要么一起成功,要么一起失败。

  1. 事务的特性

事务有很严格的定义,需要同时满足四个特性,即:原子性、一致性、隔离性、持久性。这四个特性通常称之为:ACID特性,具体如下:

- ① 原子性(Atomic):表示将事务中所有的操作捆绑成一个不可分割的单元,即对事务所进行的数据修改等操作,要么全执行,要么全不执行。

- ② 一致性(Consistency):表示事务完成时,必须使所有的数据都保持一致的状态。

- ③ 隔离性(Isolation):指一个事务的执行不能被其他事务所干扰,即一个事务内部的操作以及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

- ④ 持久性(Durability):持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。提交后的其他操作或故障不会对其有任何影响。

  1. 不考虑隔离问题,事务的并发问题

- 在实际应用过程中,数据库是要被多个用户所共同访问的,在多个事务相同的数据时,可能会发生并发问题,具体如下:

-    1)脏读:一个事务读取到另一个事务未提交的数据。

-    2)不可重复读:一个事务读到了另一个事务已经提交的update数据,导致在同一个事务中的多次查询结果不一致。

-    3)虚读/幻读:一个事务读到另一个事务已经提交的insert的数据,导致在同一个事务中的多次查询结果不一致。

  1. 设置事务的隔离级别

为了避免问题的发生,在标准的SQL规范中,定义了4个事务的隔离级别,不同级别对事务的处理不同:

- ① 读未提交(Read Uncommitted1级):一个事务的执行过程中,既可以访问其他事务未提交的新插入的数据,又可以访问未提交的修改数据。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。此隔离级别可防止丢失更新。

- ② 已提交读(Read Committed2级):一个事务在执行的过程中,既可以访问其他事务成功提交的新插入的数据,又可以访问成功修改的数据。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问改行。此隔离级别可以有效的防止脏读。

- ③ 可重复读(Repeatable Read4级):一个事务在执行过程中,可以访问其他事务成功提交的新插入的数据,但不可以访问成功修改的数据,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。此隔离级别可有效的防止不可重复读和脏读。

- ④ 序列化/串行化(Serializable8级):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个执行,不能并发执行,次隔离级别可以有效的防止脏读,不可重复读和幻读。

隔离级别

含义

READ_UNCOMMITTED

允许你读取还未提交的改变了的数据。可能导致脏、幻、不可重复读

READ_COMMITTED

允许在并发事务已经提交后读取。可防止脏读,但幻读和不可重复读仍可发送。

REPEATABLE_READ

对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏读、不可重复读,但幻读仍可能发生~~~~~~

SERIALIZABLE

完全服从ACID的隔离级别,确保不发生脏、幻不可重复读。这在所有的隔离级别中是最慢的,他是典型的通过完全锁定在事务中设计的数据表来完成的。

在使用数据库的时候,隔离级别越高安全性就越高,性能越低。

实际开发过程中,不会选择最高或者最低的隔离级别,选择:READ_COMMITTEDoracle默认),REPEATABLE_READMySQL默认)。

原文地址:https://www.cnblogs.com/sxw123/p/12811257.html