学习笔记——数据库事务

    数据库中事务是指一组原子性的SQL操作,具有ACID四个特性。

    引用《高性能mysql》中非常经典的一个理解事务4个特性的例子,下面可以参照着例子来理解:

    学习笔记——数据库事务_第1张图片

    A(原子性)是指事务中的这一系列操作要么都执行成功,要么都撤销,即将这一些列操作视为一个整体。

    C(一致性)是指在执行事务后数据状态由一个一致状态转换到另一个一致的状态,在事务执行前后checking表跟savings表中balance总值是不会变化的。

    I(隔离性)是指在一个事务执行完之前,对于其他事务来说是看不到这个事务的结果的。事务的隔离级别又分为以下4个隔离级别:

        1)读未提交(read uncommitted):顾名思义就是指在一个事务a还未提交时,另一个事务b就可以读到它的中间结果,这样的话b前面读到的数据就不是最终的数据,出现脏读问题。实际应用中很少采用。自我感觉像是事务a写未加锁的效果,不知对否。

        2)读已提交(read committed):就是指在事务a提交之后,事务b才能读到a事务所进行的操作,这样的话消除了b读取a中间结果的脏读问题。但是在事务b中连续两次读取的同一条数据结果可能不一致,中间可能穿插进了a事务所做的修改结果,存在不可重复读问题。这个感觉像是读为加锁,中间进行了写操作。

        3)可重复读(repeatable read):就是指事务b连续两次读到的单条结果都是一致的,虽然事务a还是做了一系列操作。但是在进行范围查询时有可能其他事务插入了其他数据行,从而好像出现了一个鬼影,明明前面没有的,现在却出现了,这似乎就叫做“幻读”问题,就是在保证原来单行数据未改变情况下多了记录。mysql的默认隔离级别就是可重复读。

        4)序列化(serializable):强制事务串行执行,避免了幻读问题。

        再上一幅珍藏的图,偷自《高性能mysql》:

        学习笔记——数据库事务_第2张图片

    D(持久性)是指一旦一个事务执行完成,他的结果将保存到数据库中,数据便得到了持久化。

    希望可以抛砖引玉,多受教导。

你可能感兴趣的:(Mysql)