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

    数据库事务概念:

    事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功的对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中任何一条语句因为崩溃或其他原因无法执行,那么所有语句都不执行。

    事务的原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行一部分操作。

    事务的一致性:数据库总是从一个一致性的状态转换到另外一个一致性的状态。如果事务在执行过程中系统崩溃,事务最终没有提交,那么事务中所做的修改将不会保存到数据库中。

    事务的隔离性:隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

    事务的持久性:持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

    四种隔离级别

    1、READ COMMITTED(未提交读)

    在此级别,事务中的修改,即使没有提交,对其他事务也是可见的。事务可以读取未提交的数据,这也被称为脏读。这个级别会导致很多问题,除非有非常必要的理由,在实际应用中一般很少使用。

    2、READ COMMITTED(提交读)

    大部分数据库默认的级别除了mysql。在此级别,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复读,因为两次执行同样的查询,可能会得到不一样的结果。这是由于在查询间隔,被另一个事务修改并提交了。

    3、REPEATABLE READ(可重复读)

    mysql默认支持的级别。此级别解决了脏读的问题,该级别保证了在同一个事务中多次读取同样的记录的结果是一致的。但该级别无法解决幻读的问题。所谓幻读指的是,事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

    4、SERIALIZABLE(可串行化)

    这是隔离的最高级别,它可以解决脏读、幻读、不可重复读的问题。它会在读取的每一行数据上都加上锁,所以可能导致大量的超时和锁争用的问题,实际应用中很少用到这个隔离级别。

  • 相关阅读:
    HBase目录
    HBase介绍及简易安装(转)
    Hadoop目录
    通过java读取HDFS的数据 (转)
    Flume-NG一些注意事项(转)
    spark读取 kafka nginx网站日志消息 并写入HDFS中(转)
    Java开发牛人十大必备网站
    HTTP协议状态码详解(HTTP Status Code)(转)
    Flume NG 配置详解(转)
    Android笔记(五)利用Intent启动活动
  • 原文地址:https://www.cnblogs.com/mingyao123/p/7364268.html
Copyright © 2011-2022 走看看