跳到主要内容

事务介绍

事物4个特性

对于单条SQL语句,系统自动将其作为一个事务执行,称为:隐式事务。 要手动把多条SQL语句作为一个事务执行,使用 BEGIN 开启事务,使用 COMMIT 提交事务,称为:显式事务。

  • A(Atomic) 原子性 将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行。

  • C(Consistent) 一致性 事务完成后,所有数据的状态都是一致的。

  • I(Isolation) 隔离性 如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离。

  • D(Duration) 持久性 即事务完成后,对数据库数据的修改被持久化存储。

事物隔离级别

默认隔离级别:在MySQL中,如果使用InnoDB,默认采用可重复读。 查看系统级的和会话级的隔离级别SQL命令:

select @@global.tx_isolation,@@tx_isolation;
  • 只读未提交(Read Uncommitted) 是隔离级别最低的一种。在这种级别下,一个事务会读到另一个事务更新后但未提交的数据,如果另一个事务回滚,那么当前事务读到的数据就是==脏数据(Dirty Read)==。

  • 只读已提交(Read Committed) 在这种级别下,一个事务可能会遇到==不可重复读问题(Non Repeatable Read)==。不可重复读是指,在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么在第一个事务中,两次读取的数据就可能不一致。

  • 可重复读(Repeatable Read) 在这种级别下,一个事务可能会遇到==幻读问题(Phantom Read)==。幻读是指,在一个事务中,第一次查询某条记录,发现没有,但是,当视图更新这条不存在的记录时,竟然能成功,并且再次读取同一条记录,它就神奇的出现了。

  • 可序列化(Serializable) 是最严格的隔离级别。在这种级别下,所有事务==按照次序依次执行==,因此,脏读、不可重复读、幻读都不会出现。虽然Serializable隔离级别下的事务具有最高的安全性,但是,由于事务是串行执行,所以效率会大大下降,应用程序的性能会急剧降低。如果没有特别重要的情景,一般都不会使用Serializable隔离级别。

参考文献