• JavaWeb 之事务


    什么是事务?

    • 事务就是逻辑上的一组操作,组成事务的各个执行单元,操作要么全部成功,要么全部失败.
    • 以转账为例: 张三给李四转账,张三扣1000,李四加1000; 加钱和扣钱两个操作组成了一个事务.

    1. 事务的四大特性

    • 原子性(Atomicity): 事务中所有操作是不可再分割的原子单位. 事务中所有操作要么全部执行成功,
      要么全部执行失败.
    • 一致性(Consistency): 事务的其他特性都是为了这一特性服务的.即事务执行后,数据库状态和其他业
      务规则保持一致, 如转账业务,无论事务执行成功与否,参与转账的两个帐号余额之和应该是不变的.
    • 隔离性(Isolation): 指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰.
    • 持久性(Durability): 一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使事务
      提交后,数据库马上崩溃了,在数据库重启时,也必须能保证通过某种机制恢复数据.

    2. MySql 中操作事务

    在默认的情况下,MySql 每执行一条 SQL 语句,都是一个单独的事务.如果需要在一个事务中包含多条 SQL 语句,
    那么需要开启事务和结束事务:

    • 开启事务: start transaction;
    • 结束事务: commit 或 rollback;
    // 示例: 张三给李四转账 100
    
    START TRANSACTION; // 开启事务
    UPDATE account SET balance=balance-100 WHERE id=1;
    UPDATE account SET balance=balance+100 WHERE id=2;
    ROLLBACK;  // 回滚, 表示转账失败
    
    
    START TRANSACTION; // 开启事务
    UPDATE account SET balance=balance-100 WHERE id=1;
    UPDATE account SET balance=balance+100 WHERE id=2;
    COMMIT; // 提交, 表示转账成功
    

    3. JDBC 中操作事务

    1. 在 JDBC 中操作事务,都是通过 Connection 完成的! 同一个事务中所有的操作,必须使用同一个 Connection 对象.
    2. Connection 对象与操作事务相关的方法:
      • setAutoCommit(false): 表示开启事务;
      • commit(): 表示提交事务;
      • rollback(): 表示回滚事务.
    // 代码格式:
    try{
        con.setAutoCommit(false);  // 开启事务
        ....
        ..
        con.commit(); // 提交事务
    }catch(){
        con.rollback(); // 回滚事务
    }
    
    //
    

    4. 事务隔离级别

    1. 事务的并发读问题

    • 脏读(dirty read): 读到了另一事务的未提交更新数据, 即读到了脏数据;
    • 不可重复读(unrepeatable read): 对同一记录的两次读取不一致, 因为另一事务对该记录做了修改;
    • 幻读(虚读,phantom read): 对同一张表的两次查询不一致, 因为另一事务插入了一条记录.

    2. 不可重复读和幻读的区别

    • 不可重复读是读取到了另一事务的更新;
    • 幻读是读取到了另一事务的插入.

    3. 四大隔离级别

    3.1 SERIALIZABLE (串行化)
    • 三种读问题都能处理;
    • 不会出现任何并发问题, 因为它对同一数据的访问是串行的, 非并发访问;
    • 性能最差;
    3.2 REPEATABLE READ(可重复读)
    • 防止脏读和不可重复读,不能处理幻读;
    • 性能比 SERIALIZABLE 好;
    • MySQL 数据库默认;
    3.3 READ COMMITED (读已提交数据)
    • 防止脏读, 没有处理不可重复读, 也没有处理幻读;
    • 性能比 REPEATABLE READ 好;
    • Oracle 数据库默认.
    3.4 READ UNCOMMITED(读未提交数据)
    • 可能出现任何事务并发问题;
    • 性能最好;

    5. MySQL 隔离级别

    • MySQL 的默认隔离级别为 REPEATABLE READ;
    • 查询隔离级别语句: select @@tx_isolation;

    6. JDBC 设置隔离级别

    • con.setTransactionIsolation(int level);

    参考资料:

  • 相关阅读:
    filter&map&reduce
    Linux通过进程ID查看文件路径
    PyCharm使用最多也最常用默认快捷键介绍
    Python中的深浅拷贝
    类加载器&反射
    Java web.xml 配置详解
    SpringMVC + Spring + MyBatis 整合 + Spring shrio + easyUI + 权限管理框架,带shrio session和shrio cache集群实现方案
    JAVA大数据数组排序
    高访问量WEB开发中的架构模式,学习从点滴开始
    WEB项目会话集群的三种办法
  • 原文地址:https://www.cnblogs.com/linkworld/p/7624650.html
Copyright © 2020-2023  润新知