zoukankan      html  css  js  c++  java
  • 事务

    事务概述和演示:

      一件完整的事情.可以包含多个操作,操作要么成功,要么全部失败

      mysql中的事务:

         默认是事务自动提交
         手动提交:
         1.关闭自动提交
         2.手动开启一个事务
        start transaction;
        commit;
        rollback;

    java中的事务:

       Connection接口的api
        setAutoCommit(false):手动的开启一个事务
        commit():提交
        rollback():回滚

       DBUitls使用事务:

        1.创建QueryRunner
           new QueryRunner():手动事务 调用他的方法的时候必须手动传入一个连接,连接得手动关闭,事务得手动控制.
               new QueryRunner(DataSource ds):自动事务 调用他的方法的时候不需要传入一个连接,连接自动关闭,事务自动控制.
        2.使用的方法 (手动事务)
           query(Conection con .....)
           update(Connection con .....)
    ![DBUtils在使用事务][1]


    事务中要想保证在一个事务中,必须保证使用同一个Connection连接(在中项目解决方式)

        方式1:向下传递连接(将链接对象作为参数传递给dao层)
    ![JDBCUtils&向下传递][2]

        方式2:将连接和当前线程绑定
           ThreadLocal
           常用的方法:
            set(Object value)
            Object get()
            remove()
    ![自定义工具类创建链接对象&和线程绑定][3]
    ![调用工具类][4]

    事务的特性:

    ACID

     - 原子性 -- 事务不可分割.
     - 一致性 -- 事务执行的前后数据的完整性保持一致.
     - 隔离性 -- 一个事务执行的过程中,不应该受到其他的事务的干扰.
     - 持久性 -- 事务一旦提交,数据就永久保持到数据库中.

    若不考虑隔离性的时候会发生的问题

     - 脏读        - 一个事务读到了另一个事务未提交的数据.
     - 不可重复读  - 一个事务读到了另一个事务已经提交的update数据,导致多次查询结果不一致.
     - 虚读        - 一个事务读到了另一个事务已经提交的insert数据,导致多次查询结构不一致.

    设置隔离级别

    通过设置隔离级别可以解决上面的问题
     - read uncommitted:读未提交 什么问题都避免不了
     - read committed:读已提交 避免脏读
     - repeatable read:可重复读 避免脏读和不可重复读
     - serializable:串行化 避免所有的问题 锁表
      安全:
        serializable>repeatable read>read committed>read uncommitted
      效率
        serializable<repeatable read<read committed<read uncommitted
        
    mysql中默认隔离级别 repeatable read
    oracle中默认隔离级别 read committed
  • 相关阅读:
    .ssh/config 文件的解释算法及配置原则
    不fq安装 golang tools
    iOS 组件化的几篇文章
    第一把机械键盘 ikbc C-87
    我推荐的 Java Web 学习路线
    【吐槽向】iOS 中的仿射变换
    Spring 对缓存的抽象
    Spring 事务管理笔记
    Swift 笔记汇总
    Java 类加载器
  • 原文地址:https://www.cnblogs.com/sybk/p/10004751.html
Copyright © 2011-2022 走看看