mysql 事务

什么是事务

     事务是构成单一逻辑工作单元的操作集合。

  • 数据库事务可以包含一个或多个数据库操作,但这些操作构成逻辑上的一个整体
  • 构成整体的这些数据库操作,要么全部执行成功,要么全部不执行
  • 构成事务的操作,要么全都对数据库产生影响,要么全都不产生影响,即不管事务是否执行成功,数据库总能保持一致性状态
  • 并发操作下,事务的控制尤其关键

事务的特点(ACID)

原子性(Atomic)

    事务中所有操作都作为一个整体像原子一样不可分割,要么全部成功,要么全部失败。

一致性(Consistency)

    事务的执行结果,必须使数据库从一个一致性状态到另一个一致性状态。一致性状态是指:1.系统的状态满足数据的完整性约束。2系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的总金额应该保持不变。

隔离性(Isolation)

    并发执行的事务不会相互影响,其对数据库的影响和他们串行时一样。

持久性(Durability)

    事务一旦提交,对数据库的更新就是持久的。

  • 在事务的四个特点中,一致性是事务的根本追求,而在某些情况下会对事务的一致性造成破坏:1, 事务的并发执行。2.事务故障或系统故障
  • 数据库通过并发控制技术和日志恢复技术来避免这种情况的发生。并发控制技术保证了事务的隔离性,日志恢复技术保证了事务的原子性和持久性

事务实现的原理

  • 原子性通过undo log来实现
  • 持久型通过redo log来实现
  • 隔离性通过并发控制技术+锁机制来实现
  • 一致性通过原子性、持久型和隔离性来实现

Undo log

     Undo log是为了实现事务的原子性,在mysql的InnoDB存储引擎中,还用Undo log来实现多版本并发控制(MVCC)。
    在操作任何数据之前,先把数据备份到一个地方,这个地方被称作Undo log。然后进行数据修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo log中的备份数据将数据库恢复到事务开始前的状态。

  • Undo log 是逻辑日志,可以理解为:
  • 当delete一条记录的时候,Undo log会记录下一条insert语句
  • 当insert一条记录的时候,Undo log会记录下一条delete语句
  • 当update一条记录时,Undo log会记录下一条相反的update语句

Redo log

     和Redo log相反,Redo log记录的是新数据的备份,在事务提交前,只要将Redo log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是Redo log已经持久化。系统可以根据Redo log的内容,将数据回复到最新的状态。

Mysql的隔离级别

     事务具有隔离性,理论上来说事物之间的执行不应该相互影响,对数据库的影响应该和它们串行执行一样。然而完全的隔离性会导致系统的并发能力很差,降低对资源的利用率,然而实际上对隔离性的要求会有所放宽,这也会一定程度造成数据库对一致性要求降低。

SQL标准位事务定义了不同的隔离级别,从低到高依次是:

  • 读未提交 (脏读,不可重复读,幻读)
  • 读已提交 (不可重复读,幻读)
  • 可重复读 (幻读)
  • 串行化 (无)
         不同的隔离级别会造成不同的并发异常:
  • 脏读: A事务读取了B事务更新的数据,但是B回滚了,那么A读取到的是脏数据。
  • 不可重复读:A事务多次读取了同一数据,B事务在A多次读取的过程中修改了数据,导致A事务多次读取到的数据不一致。
  • 幻读:A事务在执行完统计条目后,B事务插入了一条数据,A再次统计数目时就会产生前后统计的数目不一致的情况

不可重复读侧重于记录的修改,幻读侧重于记录的增加或删除

隔离性的实现原理

    在MySQL中,锁可以分为两类:

  • 共享锁: 共享锁将对象变为只读形式,不能进行更新,所以也成为读取锁定。
  • 排他锁:排他锁是指在执行插入,更行,删除操作的时候,其他事务不能读取该数据,因此也成为写入锁定。

    锁的粒度分为:

  • 表锁:开销小,加锁快;并发度低
  • 行锁:开销大,加锁满,并发度高

InnoDB支持表锁和行锁,但默认采用的是行锁,MyISAM只支持表锁

     InnoDB的行锁是加载索引上,如果对有索引的表进行查询,那么默认使用的是行锁,如果没有索引那么会自动退化为表锁。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值