MySQL数据库事务浅谈

什么是事务

数据库事务( transaction) 是访问并可能操做各类数据项的一个数据库操做序列,这些操做要么所有执行成功,要么所有执行失败,是一个不可分割的工做单位。
sql

通俗地说就是指一组sql语句组成的数据库逻辑处理单元,在这组的sql操做中,要么所有执行成功,要么所有执行失败。数据库

举个简单又经典的例子就是转帐了,事务A中要进行转帐,那么转出的帐号要扣钱,转入的帐号要加钱,这两个操做都必须同时执行成功,为了确保数据的一致性。并发

事务的特性

在Mysql中事务的四大特性主要包含:原子性(Atomicity)一致性(Consistent)隔离性(Isalotion)持久性(Durable),简称为ACID
性能

  • 原子性: 是指事务的原子性操做,对数据的修改要么所有执行成功,要么所有失败,实现事务的原子性,是基于日志的Redo/Undo机制
  • 一致性:是指执行事务先后的状态要一致,能够理解为数据一致性。隔离性侧重指事务之间相互隔离,不受影响,这个与事务设置的隔离级别有密切的关系。
  • 隔离性:一般来讲,一个事务的操做对于其余的事务的不可见的,也就是说通常而言事务都是独立的。可是这跟数据库的隔离级别有关,除了读未提交这种隔离级别以外,其余的都是不可见的。
  • 持久性:是指在一个事务提交后,这个事务的状态会被持久化到数据库中,也就是事务提交,对数据的新增、更新将会持久化到书库中。

Undo/Redo日志

  • Undo日志记录某数据被修改前的值,能够用来在事务失败时进行rollback;
  • Redo日志记录某数据块被修改后的值,能够用来恢复未写入data file的已成功事务更新的数据。

Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC)。
日志

经过Undo/Redo操做,可实现界面操做过程的撤销和恢复。code

假如某个时刻数据库崩溃,在崩溃以前有事务A和事务B在执行,事务A已经提交,而事务B还未提交。当数据库重启进行 crash-recovery 时,就会经过Redo log将已经提交事务的更改写到数据文件,而尚未提交的就经过Undo log进行roll back。

事务隔离级别

  • 读未提交(READ UNCOMMITTED):一个事务还没提交时,它作的变动就能被别的事务看到。
  •  读提交(READ COMMITTED):一个事务提交以后,它作的变动才会被其余事务看到。 
  • 可重复读(REPEATABLE READ):一个事务执行过程当中看到的数据,老是跟这个事务在启动时看到的数据是一致的。固然在可重复读隔离级别下,未提交变动对其余事务也是不可见的。
  •  串行化(SERIALIZABLE):对于同一行记录,“写”会加“写锁”,“读”会加“读锁”,当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。 

隔离级别解决了哪些问题
cdn

脏读(dirty read):若是一个事务读到了另外一个未提交事务修改过的数据。
blog


不可重复读(non-repeatable read):若是一个事务只能读到另外一个已经提交的事务修改过的数据,而且其余事务每对该数据进行一次修改并提交后,该事务都能查询获得最新值。
事务


幻读(phantom read):若是一个事务先根据某些条件查询出一些记录,以后另外一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另外一个事务插入的记录也读出来。
ci


MySQL锁机制

MySQL中的锁大体能够分为:

  • 共享锁/读锁(Shared Locks):
  • 排他锁/写锁(Exclusive Locks):
  • 间隙锁:
  • 行锁(Record Locks):
  • 表锁:

MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);

BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;

InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认状况下是采用行级锁。

在四个隔离级别中加锁确定是要消耗性能的,而读未提交是没有加任何锁的,因此对于它来讲也就是没有隔离的效果,因此它的性能也是最好的。 

相关文章
相关标签/搜索