zoukankan      html  css  js  c++  java
  • 数据库事务

    先看下生活中的一个场景:小李给小王转了100块钱,那么这个过程中,银行会先把小李账户减去100块,然后往小王账上加100块。如果没有异常情况,这个过程好像是没问题。那么想象下如果银行在给小李账户减了100,突然系统出问题了,小王的账户没来得及加上100。这不是有问题吗,该怎么解决呢?这就引出了下面要讨论的问题,数据库事务。

    数据库事务四大特性:

    原子性(Atomicity): 一个事务里的所有操作,要么全部执行,要么全部失败。比如上面扣账和入账的动作,必须成功或失败都保持一致,否则小王和小李都会有意见的。

    一致性(Consistemcy):事务前后数据都保持着完整性。比如转账前小李加上小王账上是100,转账后还是100。

    隔离性(Isolation):事务并发时是相互隔离的,一个事务不会影响另一个事务的执行。这个通过设置数据库隔离级别可以达到不同结果。

    持久性(Durability):事务完成提交后,将持久化到数据库中,并不会被回滚。

    再来想想并发引起的问题。

    更新丢失:两个事务同时对一行数据进行更新,但是第二个事务更新后没有提交,导致该行数据更新都失效。

    脏读:事务A对一行数据进行更新但未提交,接着事务B读取该行数据,但是事务A回滚了该操作,也就是事务B读取的数据是错误的数据。

    不可重复读:事务A连续两次读取了同一行数据,但是在两次读取的时间间隔事务B对该行数据进行了更新,导致两次读取的该行记录不相同。

    幻想读:事务A有一个带where条件的查询语句,执行后返回一个结果集,这时事务B插入了一条记录刚好满足where条件,事务A再次执行该查询语句时会把事务B插入的数据查询出来。该记录就是幻想数据。

    该如何解决这个问题呢。

    通过设置数据库隔离级别可解决这些问题,数据库一共有4个隔离级别,如下图。

      更新丢失 脏读 不可重复读 幻想读
    READ UNCOMMITTED      
    READ COMMITTED    
    REPEATABLEREAD  
    SERIALIZABLE

     

     

    从上图可看出各种隔离级别与问题的对应解决情况,而ORACLE数据库只支持READ COMMITTED和SERIALIABLE两种。

     READ UNCOMMITTED是最不安全的,但是最快,SERIALIZABLE最安全,但是最慢。呵呵,能量守恒,想要做到安全,当然要多费点功夫。

    那么隔离级别是怎么实现的呢。

    DBMS(数据库管理系统)是通过锁机制来实现各种隔离级别的。

    更新履历:

    2016.02.26   新建

  • 相关阅读:
    Gson中@SerializedName 注解使用
    centos8 安装mongodb4.4
    ssh 连接manjaro失败
    git保存仓库的账号密码
    centos 安装etcd
    kubeadm部署k8s 拉取基础镜像
    centos 安装cloc 代码统计工具
    centos7 安装mongodb
    shell获取时间戳
    最详细的阿里云ECS服务器CentOS7上安装tomcat8服务(三)
  • 原文地址:https://www.cnblogs.com/luoyebojue/p/5222081.html
Copyright © 2011-2022 走看看