JDBC事务

发布时间:2024年01月13日

1.事务

数据库事务是一组数据库操作,它们被视为一个单一的逻辑工作单元,要么全部成功执行,要么全部回滚(撤销)到事务开始前的状态。事务是确保数据库数据一致性、完整性和可靠性的关键机制之一。

简单来说,事务就是把好几个sql语句集合在一起。假如有一个事务,事务里有sql语句abc,当我们执行完语句a后,真正的数据库不会发生改变,但在mysql命令行里,你可以看到一个临时的表格,显示如果这条语句真的生效后,会发生什么。此时如果你选择rollback(回滚),就会撤销这条临时的sql指令a。

此时如果你继续执行bc语句,点击提交,这时真正的数据库才发生了改变。(只执行了bc的内容,a的被回滚了)

事务具有以下四个关键属性,通常称为 ACID 特性:

  1. 原子性(Atomicity): 事务是原子的,即要么全部执行成功,要么全部回滚,没有中间状态。如果在事务执行期间发生错误,所有对数据库的更改将被撤销。

  2. 一致性(Consistency): 事务将数据库从一种一致状态转移到另一种一致状态。在事务开始前和结束后,数据库必须保持一致性。

  3. 隔离性(Isolation): 多个事务可以并发执行,但每个事务看起来就像是在独立执行一样,不会相互影响。隔离性确保并发事务的执行不会导致不一致的数据库状态。

  4. 持久性(Durability): 一旦事务成功提交,其对数据库的更改应该是永久性的,即使在系统故障或重启后仍然有效。持久性确保事务的提交是可靠的。

数据库事务通常使用以下关键命令来定义:

  • BEGIN TRANSACTION(或简写为 BEGIN): 标志事务的开始。
  • COMMIT: 提交事务,将事务的所有更改保存到数据库。
  • ROLLBACK: 回滚事务,撤销所有未提交的更改,将数据库恢复到事务开始前的状态。

在数据库中,事务的应用可以确保在复杂的数据操作中维护数据的一致性,并防止数据损坏。例如,银行转账是一个事务,如果其中一个账户的扣款成功而另一个账户的存款失败,整个事务将被回滚,以确保数据一致性。

2.JDBC和事务

JDBC默认的事务处理行为是自动提交,所以前面我们执行一个SQL语句就会被直接提交(相当于没有启动事务),所以JDBC需要进行事务管理时,首先要通过Connection对象调用setAutoCommit(false) 方法,关闭自动提交。

connection.setSavepoint();可以设置回滚点。
connection.rollback(savepoint);可以进行回滚
connection.commit();提交
package jdbc;

import java.sql.*;

public class Transaction {
    public  static void main(String args[]){
        try(Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306","root","020809");
            Statement statement=connection.createStatement()){
            connection.setAutoCommit(false);
            statement.executeUpdate("INSERT INTO accounting_ledger.user VALUES ('lyx', '12345');");
            //设置回滚点
            Savepoint savepoint=connection.setSavepoint();
            statement.executeUpdate("INSERT INTO accounting_ledger.user VALUES ('lyx1', '12345');");
            statement.executeUpdate("INSERT INTO accounting_ledger.user VALUES ('lyx2', '12345');");

            //将会回滚到第一条sql语句执行后
            connection.rollback(savepoint);
            //提交事务,只会执行第一条sql语句
            connection.commit();
        }catch (SQLException e){
            e.printStackTrace();
        }
    }
}

文章来源:https://blog.csdn.net/qq_52315213/article/details/135570887
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。