JDBC复习--数据库事务

此博客仅为本人学习JDBC时所做记录。

08-数据库事务

8.1 事务

一组逻辑操作单元,使数据从一种状态变换到另一种状态。

一组逻辑操作单元,一个或多个DML操作

8.2 事务处理的原则

保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。

当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态

说明:

  1. 数据一旦提交,就不回滚

  2. 哪些操作会导致数据的自动提交

    • DDL操作一旦执行,都会自动提交
      • set autocommit =false 对DDL操作失效
    • DML默认情况下,一旦执行,就会自动提交
      • 我们可以通过set autocommit = false 的方式取消DML操作的自动提交
    • 默认在关闭连接时,会自动提交数据
8.3 代码的体现
 @Test
    public void testUpdateWithTx() {

        Connection conn = null;
        try {
            conn = JDBCUtils.getConnection();
            System.out.println(conn.getAutoCommit());
//            取消数据的自动提交
            conn.setAutoCommit(false);

            String sql1 = "update user_table set balance = balance-100 where user = ?";
            update(conn,sql1,"AA");

//        模拟网络异常
            System.out.println(10/0);

            String sql2 = "update user_table set balance = balance+100 where user = ?";
            update(sql2,"BB");

            System.out.println("转账成功");

//            提交数据
            conn.commit();
        } catch (Exception e) {
            e.printStackTrace();
//            回滚
            try {
                conn.rollback();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        } finally {
            //修改为自动提交数据
            //主要针对于使用数据库连接池的使用
            try {
                conn.setAutoCommit(true);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            
            JDBCUtils.closeResource(conn,null);
        }
    }
8.4 通用的增删改操作(考虑事务)
//通用的增删改操作  ----version2.0
public int update(Connection conn,String sql,Object ...args){//sql中占位符的个数应该与可变形参args的个数一致
    PreparedStatement ps = null;
    try {
        ps = conn.prepareStatement(sql);
        for (int i=0;i<args.length;i++)
        {
            ps.setObject(i+1,args[i]);//注意i+1
        }
        return ps.executeUpdate();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        JDBCUtils.closeResource(null,ps);
    }
    return 0;
}
8.5 通用的查询(考虑事务)
//通用的查询操作,用于返回数据表中的一条记录(version 2.0:考虑上事务)
    public <T> T getInstance(Connection conn,Class<T> clazz,String sql,Object ...args) {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(sql);
            for (int i=0;i<args.length;i++) {
                ps.setObject(i + 1, args[i]);
            }
            rs = ps.executeQuery();
            ResultSetMetaData rsmd = rs.getMetaData();
            int columnCount = rsmd.getColumnCount();
            if(rs.next()){
                T t = clazz.newInstance();
                for (int i=0;i<columnCount;i++) {
                    Object columnValue = rs.getObject(i + 1);
                    String columnLabel = rsmd.getColumnLabel(i + 1);
                    Field field = clazz.getDeclaredField(columnLabel);
                    field.setAccessible(true);
                    field.set(t, columnValue);
                }
                return t;
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(null,ps,rs);
        }
        return null;
    }
8.6事务中必须知道的几点
8.6.1 四大属性(ACID)
  1. 原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  2. 一致性(Consistency)
    事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

  3. 隔离性(Isolation)
    事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

  4. 持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

    多余的小知识:

    BAT:百度、阿里、腾讯

    BBA:奔驰、宝马、奥迪

    TMD:头条、美团、滴滴

8.6.2 数据操作过程中可能出现的问题(针对隔离性)
  1. 脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段。之后, 若 T2 回滚, T1读取的内容就是临时且无效的。
  2. 不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段。之后, T1再次读取同一个字段, 值就不同了。
  3. 幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行。之后, 如果 T1 再次读取同一个表, 就会多出几行。
8.6.3 数据库中的四种隔离级别

一致性和并发性:一致性越好,并发性越差。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LpOyGIbA-1608480337350)(file://C:\Users\蔲丫丫\Desktop\尚硅谷_宋红康_JDBC核心技术(2019新版)]\1-课件\课件-md\尚硅谷_宋红康_JDBC.assets\1555586275271.png?lastModify=1608457562)

  • Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE。 Oracle 默认的事务隔离级别为: READ COMMITED

  • Mysql 支持 4 种事务隔离级别。Mysql 默认的事务隔离级别为: REPEATABLE READ。

8.6.4 如何查看并设置隔离级别
  1. 查看当前的隔离级别:

    SELECT @@tx_isolation;
    
  2. 设置当前 mySQL 连接的隔离级别:

    set  transaction isolation level read committed;
    
  3. 设置数据库系统的全局的隔离级别:

    set global transaction isolation level read committed;
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值