美文网首页
事务隔离级别

事务隔离级别

作者: 晨曦_lcq | 来源:发表于2020-08-10 08:43 被阅读0次

    事务隔离特性

    支持事务的数据库必须满足四个特性:

    • 原子性:整个操作要么执行成功,要么执行失败
    • 持久化:事务提交后就持久化到数据库
    • 隔离性:各个事务之间是相互隔离的
    • 一致性:事务开始前和开始后,数据的完整性没有破坏。如A向B转账,不可能A扣了钱,B没收到钱

    概念

    • 脏读: 可以读到其他事务没有提交的数据。
    • 不可重复读:多次查询期间,有人进行了更新操作,读取的数据不一致。
    • 幻读:多次查询期间,有人进行了新增、删除操作,读取的数据发生了变化。一脸懵逼,刚才发生了什么。

    事务隔离级别

    • 读未提交读(read uncommit):可以读到没有提交的数据
    • 提交读(read commited):只能读到其他事务已经提交的数据,并不是加锁使用了快照读
    • 可重复读(repeated read):多次读取,读到的数据都是一样的。不能避免幻读( insert or delete)
    • 序列化(Serializable):一个一个来,串行执行

    事务隔离级别

    • PROPATION_REQUIRED_NEW: 开启一个新事务,如果当前已经存在事务则挂起
    • PROPATION_REQUIRED: 如果当前有事务,则加入当前事务,如果当前没有事务,则创建一个新的
    • PROPATION_NOT_SUPPORT: 非事务的执行,如果存在一个活动事务则挂起
    • PROPATION_NEVER: 总是非事务的执行,如果存在一个活动事务则抛出异常
    • PROPATION_MANDATORY: 如果存在一个事务,则支持当前事务。如果没有一个活动的事务,则抛出异常。
    • PROPATION_SUPPORTS: 如果当前方法存在一个事务,则将方法置于同一个事务,如果之前不存在事务,则以非事务执行
    • PROPATION_NESTED: 如果一个活动的事务存在,则运行一个嵌套的事务中。如果没有活动事务,则按PROPATION_REQUIRED属性执行。

    区别

    假设服务A调用服务B:

    情景 requires_new(两个独立的事务) nested(B嵌套在A的事务里) required(同一个事务)
    A和B都正常提交 B先提交,A再提交 A和B一起提交 A和B一起提交
    B抛异常,A正常 1.A有catch B的异常,B回滚,A正常提交;2.A没有catch B的异常,B回滚,A再回滚 B先回滚,A再回滚 A和B一起回滚
    B正常,A异常 B正常提交,A回滚 A和B一起回滚 A和B一起回滚
    A和B都异常 B先回滚,A再回滚 A和B一起回滚 A和B一起回滚

    相关文章

      网友评论

          本文标题:事务隔离级别

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