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

    事务

    1.概念

    事务是指逻辑上的一组操作,要么全部成功,要不全都不成功。

    例如 A 给 B 转账,需要执行两条sql语句:

    update user set money=money-100 where name='A';
    update user set money=money+100 whwew name='B';
    

    上面两句sql要么一起成功,要么一起失败,但不允许一部分成功,一部分失败。

    2. 事务管理

    数据库默认支持事务,如果不手动控制事务,一条sql独占一个事务。

    1. sql手动控制事务
      • start transaction; 开启事务,此代码之后的sql全在一个事务。

      • Commit;--提交事务,此代码以上的sql一起执行。

      • rollback;--回滚事务,此代码以上的sql一起不执行。

    2. jdbc中的事务控制
      • conn.setAutoCommit(false);--开启事务,conn将不会主动提交事务。

      • conn.commit();--提交事务

      • conn.rollback();--回滚事务

    3. 四大特性 (ACID)

    • 原子性(Atomicity)
      指事务是一个不可分割的工作单位,事务中的操作要么一起发生,要么一起不发生。

    • 一致性(Consistency)
      一致性是指事务使得系统从一个一致的状态转换到另一个一致状态,其他事务对其中间状态不可见。

    • 隔离性(Isolation)
      多个事务同时访问数据库;一个事务不能被其他事务干扰。

    • 持久性(Durability)
      指一个事务一旦被提交,对数据库的改变是永久的,不可逆,接下来的任何操作都无法逆转。

    4. 隔离性

    4.1 隔离性分析

    • 多个用户同时查询同一条数据,无需隔离。
    • 多个用户同时修改一条数据,一定需要隔离。
    • 一个用户查询,另一个用户修改,可能会出问题。

    4.2 隔离性可能造成的问题

    1. 脏读
      一个事务读到另一个事务未提交的数据。

    2. 不可重复读
      一个事务督导另一个事务已经提交的数据。

    3. 虚度(幻读)
      发生的概率非常低,在读取整表时,多次读取的结果不一致。

    5. 数据库的隔离级别

    为了防止上述问题,数据库提供了不同的隔离级别。

    • read uncommitted:不做任何隔离,可能会造成所有隔离性问题。

    • read committed:可以防止脏读,但是不能防止不可重复读和虚读。

    • repeatable read:可以防止脏读和不可重复读,但是不能防止虚读。

    • serializable:可以防止所有隔离性问题,但是数据库就被设计成了串行的数据库,性能很低。

    隔离级别排序:

    • 安全性:read uncommitted<read committed<repeatable read<serializable

    • 效率:read uncommitted>read committed>repeatable read>serializable

    mysql默认隔离级别:repeatable read
    oracle默认隔离级别: read committed

    6. 操作数据库的隔离级别

    查询数据库的隔离级别:select @@tx_isolation;

    设置隔离级别:

    set[session/global]transaction isolation level xxxx;
    默认是session,表示当前连接有效,global表示全局修改。
    

    7. 数据库中的锁

    7.1 共享锁

    共享锁可以和共享锁共存,共享锁和排它锁不能共存,在serializable级别下查询时会添加共享锁,其他级别不会。

    7.2 排他锁

    排它锁和任何锁不能共存,在任何隔离级别下做增删改操作都会添加排它锁。

    7.3 死锁

    彼此握着对方的资源互不释放,导致彼此都无法继续执行,等待对方释放资源。

  • 相关阅读:
    WPF 分页控件Pager
    vue Map 渲染DOM
    IDEA 开发工具 Mybatis 快速开发插件 ==》MyBatisX
    令自己的本地ip可以被外网访问
    mybatis按datetime条件查询,参数为时间戳时
    springmvc传参---LocalDateTime、Date等时间类型转换
    java excel导出(表头合并,多行表头)
    JMeter学习工具简单介绍
    idea项目 run、debug变灰色的问题
    vue的ui库使用Element UI,纯html页面,不使用webpack那玩意
  • 原文地址:https://www.cnblogs.com/juzhuxiaozhu/p/12773335.html
Copyright © 2011-2022 走看看