zoukankan      html  css  js  c++  java
  • 事务问题

    本文只是作者整理的笔记,摘抄自他人

    原文链接:https://blog.csdn.net/zjxxyz123/article/details/79413729

    事务总结:
    事务的特性:★★★
    ACID
    原子性:事务里面的操作单元不可切割,要么全部成功,要么全部失败
    一致性:事务执行前后,业务状态和其他业务状态保持一致.
    隔离性:一个事务执行的时候最好不要受到其他事务的影响
    持久性:一旦事务提交或者回滚.这个状态都要持久化到数据库中
    不考虑隔离性会出现的读问题
    脏读:在一个事务中读取到另一个事务没有提交的数据
    不可重复读:在一个事务中,两次查询的结果不一致(针对的update操作)
    虚读(幻读):在一个事务中,两次查询的结果不一致(针对的insert操作)
    通过设置数据库的隔离级别来避免上面的问题(理解)
    read uncommitted 读未提交 上面的三个问题都会出现
    read committed 读已提交 可以避免脏读的发生
    repeatable read 可重复读 可以避免脏读和不可重复读的发生
    serializable 串行化 可以避免所有的问题

    起初隔离级别为read uncommitted 读未提交;a,b两个会话,分别开启两个事务,然后a向b转了500元钱,但a未提交该事务,
    此时b查看,发现多了500.然后a回滚事务,b再查看账户,发现根本就没有多500.这便是脏读。
    脏读便是可以读取到另一个事务尚未提交的数据。
    如果我们此时将隔离级别提升为read committed 读已提交,便可避免脏读。同样b两个会话,分别开启两个事务,然后a向b转了500元钱,
    但a未提交该事务,此时b查看,依旧是原钱数.
    但此时,如果a 提交事务,b再去查看,发现此时多了500,对b而言,在一个事务中,两次查询的结果不一致,这便是不可重复读。
    如果我们此时将隔离级别提升为repeatable read 可重复读,可以避免脏读和不可重复读的发生。同样a 提交事务,b再去查看,发现
    依旧是原钱数,b只能结束当前事务,在开启一个新事务,才能查询到数据的变化,这al便避免了不可重复读。
    如果我们设置了seriizable串行化,就相当于锁表,某一时间内只允许一个事务访问该表。


    mysql默认隔离级别:repeatable

    oracle/sqlserver:read commited

  • 相关阅读:
    插入数据Oracle异常ORA-01502: 索引或这类索引的分区处于不可用状态
    关于分布式系统的数据一致性问题
    C#网络编程系列文章之Socket实现异步TCP服务器
    大型网站架构与分布式架构
    序列化表单为json
    学习wcf
    C# 知识梳理
    Java前端控制器模式
    Java策略模式
    Java责任链模式
  • 原文地址:https://www.cnblogs.com/kiwi-deng/p/11423892.html
Copyright © 2011-2022 走看看