事务

作者: zsj0310 | 来源:发表于2017-05-04 23:15 被阅读0次

    事务

    事务是一个并发控制的单位,是用户定义的一个操作序列。包含了多个sql操作。

    事务特性

    原子性:要么都做,要么都不做。
    一致性:完成事务后,所有的数据必须是一致的,比如转账。
    隔离性:事务之间是隔离操作的。
    持久性:事务完成之后,不能再返回原状态了。

    不隔离时可能发生的问题

    1.脏读:比如一个事务t1有2条修改数据的sql,执行完第一条后,事务t2读取了数据,然而t1的第二条sql还没执行,导致读取数据不对,这就是脏读。
    2.不可重复读:事务t1读取数据,事务t2修改了数据,事务t1短时间内又读取,发现数据不同了,这就是不可重复读。
    3.幻读:事务t1修改了数据,此时t2事务插入又修改了数据,导致t1查看数据时发现数据不对,这就是幻读。

    事务隔离级别(Mysql)

    1.Serializable(串行化):相当于给表上锁,隔离级别最高,但执行效率最低
    2.Repeatable Read(可重复读):可避免脏读和可重复读的发生。
    3.Read Commited(读已提交):避免脏读。 Mysql的默认级别
    4.Read UnCommited(读未提交):什么都不能避免。

    Spring事务传播

    事务传播(嵌套):在service中一个事务/非事务方法调用了另一个事务/非事务方法。

    前提:方法A调用了方法B
    Required:如果A启动了事务,则B就不用再启动事务;如果A没有启动事务,则B需要启动事务。
    Supports:如果A启动了事务,则B不用启动;如果A不启动,B也不启动。
    Required_New:新启动B事务,并将A事务挂起,等到B事务执行完再继续执行,如果B事务失败了,AB都回滚,如果A失败B成功,则只有A回滚B不回滚。
    Never:B事务直接抛出异常。
    Nested:B事务成为A事务的子事务,即”嵌套事务“,B开始执行时候获得一个savepoint,如果B失败,则A回滚到savepoint的位置,只有A执行完成B才会被真正提交。

    相关文章

      网友评论

          本文标题:事务

          本文链接:https://www.haomeiwen.com/subject/ceidtxtx.html