Mysql事务的那些事儿

  1. 事务会把数据库从一种一致状态转换为另一种一致状态,在数据库提交工作时,可以确保其要么所有修改都已经保存了,要么所有修改都不保存。

  2. 事务的四个性质–ACID(原子性、一致性、隔离性、持久性)。

    • 原子性

      整个数据库事务是不可分割的工作单位。

    • 一致性

      事务将数据库从一种状态转变为下一种一致的状态。

    • 隔离性

      一个事务的影响在该事务提交前对其他事务都不可见。

    • 持久性

      事务一旦提交,其结果就是永久性的。

  3. 原子性、一致性、持久性通过数据库的redo和undo来完成。隔离性通过锁实现。

    • redo

      事务日志通过redo日志文件和InnoDB存储引擎的日志缓冲来实现。当开始一个事务,会记录该事务的一个LSN(log sequence number),当事务执行时,会往日志缓冲插入事务日志,当事务提交时,必须将日志缓冲写入磁盘。也就是需要先写日志,再写数据(预写日志方式)。

    • undo

      undo与redo正好相反,对于数据库进行修改时,数据库不但会产生redo,还会产生一定量的undo,即使你执行的事务或语句由于某种原因失败了,或者如果你用一条rollback语句请求回滚,就可以利用这些undo信息将数据回滚到修改之前的样子。undo存放在数据库内部的一个特殊段中,这成为undo段,undo段位于共享表空间内。

  4. start transaction | begin:显式地开启一个事务
    commit:提交事务,并使得已对数据库做的修改成为永久性的。
    rollback:回滚会结束你的事务,并撤销正在进行的所有未提交的修改。
    savepoint identifier:savepoint允许你在事务中创建一个保存点,一个事务中可以有多个savepoint。
    release savepoint identifier:删除一个事务的保存点。
    rollback to [savepoint] identifier:可以把事务回滚到标记点,而不回滚此标记点之前的任何工作。
    set transaction:设置事务的隔离级别。(4个隔离级别:read uncommited、read committed、repeatable read、serialiable)

  5. InnoDB存储引擎默认的支持隔离级别是repeatable read。在这个事务隔离级别下,使用next-key lock锁算法,避免了幻读的产生。

  6. 隔离级别越低,事务请求的锁越少,或者保持锁的时间就越短。这也是为什么大多数数据库系统默认的事务隔离级别是read committed。

  7. 在使用分布式事务时,InnoDB存储引擎的事务隔离必须设置为serialiable。

  8. 隔离级别与相应的问题:

事务/问题脏读不可重复读幻读
Read Uncommitted
Read Committed×
Repeatable read××
Serialiable×××

问题解释:

  • 脏读

    一个事务正在访问数据,并对数据进行了修改,而这种修改还没有提交到数据库中,另外一个事务也访问了这个数据并使用了这个数据。

  • 不可重复读

    在一个事务中,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问同一数据。那么,在第一个事务中的两次读数据之间,第二个事务修改了数据,那么第一个事务读到的数据可能是不一样的,这样就发生了在一个事务内两次读不一致的现象,因此成为不可重复读。

  • 幻读

    是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值