数据库事务集合
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