mysql事物

一些mysql学习中的随笔:

①为什么要有事务:(重点保证原子性与隔离性)

一个数据库事务通常包含对数据库进行读或写的一个操作序列。它的存在包含有以下两个目的:

     为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库在异常状态下仍能保持一致性的方法。

      当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,保证彼此的操作互相干扰。

②幻读的可能的危害:(主要指mysql数据库)

      MVCC对幻读的解决是不彻底的,通过快照读方式解决select幻读问题;但不能解决当前读。

      例如:事务一查询当前符合条件的记录;事务二填加了一条符合条件的记录;事务一再进行更新 删除等操作,可能对事务二也影响

③ 快照读:select

    当前读:update,delete,insert,select ... lock in share mode,select ... for update

④幻读与可重复读:考虑到事务必须具有隔离性,所以读到其他事务的所操作的记录 是错误的,必须考虑;

⑤快照读的本质:,undo log作为旧版数据的快照

⑥排他锁,共享锁

排它锁(Exclusive),又称为X 锁,写锁。

共享锁(Shared),又称为S 锁,读锁。

一个事务对数据对象O加了 S 锁,可以对 O进行读取操作,但是不能进行更新操作。加锁期间其它事务能对O 加 S 锁,但是不能加 X 锁。

一个事务对数据对象 O 加了 X 锁,就可以对 O 进行读取和更新。加锁期间其它事务不能对 O 加任何锁。

⑦:特别的  begin只有在数据进行了增删改查等操作才会开启一条事务

⑧一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行正在执行DELETE或UPDATE操作,这是读取操作不会因此等待行上锁的释放。相反的,InnoDB会去读取行的一个快照数据

⑨mysql日志:

mysql在事物开始操作数据之前,会先将原始数据备份到一个undolog的地方,这样做的目的有两个。第一是为了保证事物的原子性,如果事物在执行的过程中出现了某些错误,或者是用户执行了rollback的操作,mysql可以利用undolog中的备份将数据恢复到事物开始之前的状态。第二是为了实现多版本的并发控制,事物在提交之前,undolog中保存了未提交之前的数据版本,undo log可以作为旧版数据的快照供其他并发访问的事物实现快照读。

mysql在事物开始之后,事物中操作的任何数据,会将最新的数据备份到一个地方(redolog),就是在事物执行的过程中,开始将数据写入redo buffer中,最后写入redolog中,具体的落盘策略可以自行配置。这样做的目的是:为了实现事物的持久性,防止在发生故障的时间点,尚有脏页写入磁盘,在mysql重启的时候,根据redolog重做,从而使事物未入磁盘的数据达到持久化这一特定。

⑩redo buffer 

你可能感兴趣的:(mysql事物)