• Java事务


    一、什么是事务?

      1、事务遵循ACID原则:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性(durability);

    二、为什么要事务?

      保证数据的安全;

    三、事务中出现的问题?

      脏读:张三的账户有5000元,事务A将账户余额修改为8000,但事务A尚未提交;事务B访问账户读到了张三的账户是8000,此时事务A发生了异常回滚了,张三账户仍为5000;事务B读到的8000即为脏数据

      不可重复读:张三账户有5000元,事务A查询账户为5000,此时事务B更新账户为8000,事务A未提交,再次查询账户为8000,两次查询不一样,事务A发生了不可重复读

      幻读:工资为5000的员工有10个,事务A读取到有10个工资为5000的员工,事务B此时插入一个5000员工,事务A再次读取到有11个工资为5000的员工,事务A就发生了幻读

      第一类丢失更新:

      在完全未隔离事务的情况下,两个事务更新同一条数据资源,某一事务完成,另一事务异常终止,回滚造成第一个完成的更新也同时丢失 。这个问题现代关系型数据库已经不会发生。

      第二类丢失更新:

      A事务覆盖B事务已经提交的数据,造成B事务所做的操作丢失 

                   

    四、如何解决这些问题?

      简单来讲,解决不可重复读的方法是 锁行,解决幻读的方式是 锁表

      四种隔离级别:

      1、读未提交(Read uncommit);

        这时,select语句不加锁,可能读到数据不一致,即脏读;并发高隔离性最差的一种级别;

      2、读已提交(Read commit);

        可以避免脏读;

    ----------------------------------------互联网大数据量,高并发量的场景下,几乎不使用以上两种级别-----------------------------------------------

      3、可重复读(Repeatable read );

        避免脏读、可重复读。是mysql的默认隔离级别

      4、串行化(Serializable);

        可避免脏读、可重复读、幻读的发生;

    以上四种隔离级别最高的是 Serializable 级别,最低的是 Read uncommitted 级别,当然级别越高,执行效率就越低。

    像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。

  • 相关阅读:
    Redis02——Redis单节点安装
    Redis01——Redis产生背景
    验证元素的唯一性(二重循环法和快排优化)
    线性同余法的伪随机数
    转载(为啥要对10000007取模)
    (算法专题)使用常微分方程将递归转换为非递归
    算法设计与分析——习题一
    PAT Basic 1030 完美数列 (25 分)
    禁止yum update 自动更新系统内核
    Redis AOF 持久化方式
  • 原文地址:https://www.cnblogs.com/jiangbaoyabo/p/15194654.html
Copyright © 2020-2023  润新知