事物

4个属性(ACID)

  • A:Atomicity,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行;
  • C:Consistency,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;
  • I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;
  • D:Durability,持久性,即事务完成后,对数据库数据的修改被持久化存储。

对于单条SQL语句,数据库系统自动将其作为一个事务执行,这种事务被称为隐式事务

要手动把多条SQL语句作为一个事务执行,使用BEGIN开启一个事务,使用COMMIT提交一个事务,这种事务被称为显式事务.

可能会出现的问题

Dirty Read(脏读)

指的是事物A在读取的时候读取到事物B刚刚更新但未提交的数据。

Non Repeatable Read(不可重复读)

指的是事物A在事物开始时查询某行数据,之后事物B执行了更新操作导致事物A再读的时候两边数据不一致。

Phantom Read(幻读)

在同一个事务中,使用相同的查询条件多次查询时,后续查询返回了之前没有的新记录。

**幻读和不可重复读的区别:**幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同)。所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数);不可重复读是指读到了已经提交的事务的更改数据(修改),幻读是指读到了其他已经提交事务的新增或删除数据。

隔离级别

对于两个并发执行的事务,如果涉及到操作同一条记录的时候,可能会发生问题。因为并发操作会带来数据的不一致性,包括脏读、不可重复读、幻读等。数据库系统提供了隔离级别来让我们有针对性地选择事务的隔离级别,避免数据不一致的问题。

SQL标准定义了4种隔离级别,分别对应可能出现的数据不一致的情况:

Isolation Level 脏读(Dirty Read) 不可重复读(Non Repeatable Read) 幻读(Phantom Read)
Read Uncommitted Yes Yes Yes
Read Committed - Yes Yes
Repeatable Read - - Yes
Serializable - - -

Read uncommitted (读未提交)

  如果一个事务A已经开始写数据,则另一个事务B不允许写操作。但是可以读取这个事务A修改但未提交的数据。最低级别,任何情况都无法保证。

Read Committed (读已提交)

  事务A只能读取事务B修改并且提交后的数据行,禁止访问事务B处于写状态的数据行。可以避免脏读。

Repeatable Read(可重复读取)

  事务A在读取数据行时,禁止其他事务对该数据行进行更改,但是可以进行读取操作。进行写操作时,禁止其他事务的任何操作。可以防止脏读和不可重复读。

Serializable (可串行化)

  提供严格的隔离级别,要求事务一个个的执行。不能并发执行。有效的防止脏读,不可重复读,幻读。