数据库事务概述和批处理

5 篇文章 0 订阅

数据库事务集合

1.事务概述

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执
行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更
新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误
恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、
隔离性和持久性)属性。事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务
的处理。
事务开始于
- 连接到数据库上,并执行一条DML语句insert、update或delete
- 前一个事务结束后,又输入了另一条DML语句
事务结束于
- 执行commit或rollback语句。
- 执行一条DDL语句,例如create table语句,在这种情况下,会自动执行commit语句。
- 执行一条DDL语句,例如grant语句,在这种情况下,会自动执行commit。
- 断开与数据库的连接
- 执行了一条DML语句,该语句却失败了,在这种情况中,会为这个无效的DML语句执行rollback语
句。

2.事物的四大特点(重点!)

(ACID)
- actomicity(原子性)
表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败
- consistency(一致性)
表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态
- isolation(隔离性)
事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修
改它之后的状态,事务不会查看中间状态的数据。
- durability(持久性)
持久性事务完成之后,它对于系统的影响是永久性的。

1.原子性:就是begin开始一个事务后,在commit或rollback前时全部是一个整体,要全部都完成执行才能进行提交---->>>原子性也就是所有是一个整体

2.一致性:事物中有错误的操作所有其他语句不能执行要执行回滚(可能和原子性很像,注意区别开)

3.隔离性:不赘述

4.持久性:提交事务后不可逆操作

3.事务在java中的应用

如果JDBC连接处于自动提交模式,默认情况下,则每个SQL语句在完成后都会提交到数据库。
事务使您能够控制是否和何时更改应用于数据库。它将单个SQL语句或一组SQL语句视为一个逻辑单
元,如果任何语句失败,则整个事务将失败。
要启用手动事务支持,而不是JDBC驱动程序默认使用的自动提交模式,请使用Connection对象的
setAutoCommit()方法。如果将boolean false传递给setAutoCommit(),则关闭自动提交。我
们可以传递一个布尔值true来重新打开它。

connection就相当于数据库操作中打开了一个事务的连接

//事务进行是否自动提交的设置
conn.setAutoCommit(false);

//进行事务的提交和事务回滚
conn.commit();
conn.rollback();

4.示例

此示例中包含了事务的一个批处理Batch

思路是一样的,先将预状态通道中的sql语句添加到批处理中进行就绪等待

等待调用预状态通道执行executeBatch()是开始进行批处理更新数据

之后返回一个int型的状态码数组—>>>产生改变的数据库行数

注意:添加到batch中后执行一定是进行Batch,而不是代码中注释的一行错误示范

package com;


import java.sql.*;

/**
 * @Author: fyw
 * @Description:
 * @Date Created in 2021-08-29 20:39
 * @Modified By:
 */
public class Demo06 {
    public static void main(String[] args) {
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Connection connection = null;
        //1.    加载驱动类
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");

            String url = "jdbc:mysql://localhost:3306/mode05-05?serverTimezone=UTC";
            String userName = "root";
            String passWord = "123456";
            //2.    获得连接
            connection = DriverManager.getConnection(url, userName, passWord);
            connection.setAutoCommit(false);
            //3.    定义sql语句,创建状态通道,进行sql语句的发送
            String sql = "insert into `mode05-05`.teacher(tname)values(?)";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,"张三a");
            preparedStatement.addBatch();
            preparedStatement.setString(1,"张三b");
            preparedStatement.addBatch();
            preparedStatement.setString(1,"张三c");
            //System.out.println(5/0);
            preparedStatement.addBatch();
            preparedStatement.setString(1,"张三d");
            preparedStatement.addBatch();

            //int i = preparedStatement.executeUpdate();//只能执行一条语句
            int[] ints = preparedStatement.executeBatch();
            //pps.executeBatch(); //执行的是批处理中的所有语句,进行一个全部执行
            for(int t:ints){
                System.out.println(t);
            }
            connection.commit();

        } catch (Exception e) {
            try {
                connection.rollback();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                //5.    关闭资源
                if (preparedStatement != null) {
                    preparedStatement.close();

                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

        }

    }
}

jdbc的使用:https://blog.csdn.net/weixin_45653293/article/details/119975937?spm=1001.2014.3001.5502

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fyw(ー`´ー)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值