jdbc 对事务的支持

  • MySQL中默认开启事务自动提交功能,即 每个SQL语句都会自动开启一个事务并提交,如果没有显式地使用COMMIT或者ROLLBACK语句,则所有的修改都将被保存到数据库中。这种情况下,如果某个操作出现错误,就无法回滚事务,已经执行的操作也无法撤回,这可能会导致数据丢失或不一致的情况。
  • 因此,在某些情况下,为了保证数据的完整性和一致性,需要手动关闭事务自动提交,即设置为手动提交模式,在必要的时候手动使用COMMIT或者ROLLBACK语句来提交或回滚事务,这样可以更好地控制事务的边界和粒度,避免不必要的错误和损失。
  • MySQL中关闭事务自动提交是为了在 一个事务 中执行 多个操作 并保持数据的一致性。
  • 在默认情况下,MySQL会自动将每个SQL语句作为单独的事务处理,并立即将其提交。这种行为虽然提供了便利性,但在一些情况下可能会导致数据不一致的问题。
  • 例如,如果一个事务中的一个操作失败,则整个事务应该回滚。如果自动提交已启用,则无法回滚整个事务,因为部分操作已经提交。另一个例子是当多个用户同时访问一个表时,自动提交可能导致并发问题
  • 关闭自动提交可以将多个操作放在同一个事务中,这样可以确保全部操作成功后再提交事务,从而保证数据的一致性。
  • 关闭事务自动提交可以在  一个事务 内执行多个SQL语句 ,当所有SQL语句执行完毕并且 都没有出现错误时,再提交这个事务,避免不必要的提交和回滚操作。这样可以提高数据的完整性、一致性和安全性。而如果开启了事务自动提交,在执行一条SQL语句后就会立即提交事务,如果后续SQL语句出现错误,就无法回滚已提交的SQL语句,从而可能导致数据的丢失或不一致的情况出现。因此,关闭事务自动提交是一种更加安全和可靠的方法。
  • MySQL默认情况下是开启事务自动提交的,也就是说,一旦执行了一条SQL语句,就会自动提交当前事务。如果在一些复杂的操作中遇到问题,事务就不能很好地保障数据的完整性,很难回滚到之前的状态,会导致数据丢失或错误,因此关闭事务自动提交可以更好地管理数据。
  • 关闭事务自动提交后,就需要手动开启和提交事务,可以将一系列SQL语句 组成一个逻辑操作,一旦其中某个操作出现问题,整个操作就可以回滚到之前的状态,保障数据的完整性。这可以防止意外删除或修改记录,确保数据的正确性和安全性。
  • 总之,关闭事务自动提交可以在复杂操作中更好地管理数据,减少数据丢失和错误的风险。
  • 在 MySQL 中关闭事物自动提交(autocommit)可以保证在一个事物中执行的所有语句要么全部成功,要么全部回滚,避免了在事物执行过程中的意外提交或回滚,从而保证了数据的完整性和 一致性
  • 当事物自动提交开启时,每一条 SQL 语句 都被 视为一个独立的事物,执行完毕后会自动提交。这在某些情况下可能会导致数据出现混乱或错误,例如在执行一系列更新语句时,其中某些语句成功而某些语句失败时,开启自动提交后已经成功的语句会被提交,而失败的语句则会回滚,导致数据不一致。
  • 因此,关闭事物自动提交可以从根本上避免这种情况的发生,以确保数据的 完整性 一致性
  • 关闭事务自动提交可以使得 多个操作在同一个事务中执行 ,从而保证数据的完整性和一致性。如果开启了事务自动提交,每个SQL语句将会在执行完成后立即提交,这会导致如果出现问题,无法回滚之前的操作。如果关闭事务自动提交,可以在多个操作执行完成后手动提交事务,或者在出现问题时回滚事务,从而保证数据的一致性和完整性。因此,关闭事务自动提交对于保证数据的正确性和完整性非常重要。
  • 关闭MySQL事务的自动提交,可以提高数据库操作的效率和安全性。
  1. 提高数据库操作的效率:

           MySQL中的 每个SQL语句都是一个事务,而每次执行SQL语句都会自动提交事务,这样就会产生 大量的I/O操作,降低数据库操作的效率。关闭自动提交功能后,可以在 多个SQL语句执行完成后再一次性提交,从而减少I/O操作,提高数据库操作的效率。

  1. 提高数据库操作的安全性:

关闭自动提交后,可以手动进行事务的提交和回滚,避免了因为操作失误或异常导致数据的不一致性,从而提高了数据库操作的安全性。同时,对于大批量数据的插入、删除、修改操作,也可以保证操作的原子性,避免了数据被部分修改的情况。

关闭MySQL的事务自动提交可以提高数据库操作的灵活性和安全性。以下是一些原因:

  1. 更好的错误处理:如果在一个完整的事务中执行多个SQL语句,其中一个语句失败可能会导致整个事务失败。如果自动提交打开,则错误会立即提交,使得回滚整个事务变得更加困难。关闭自动提交可以让系统在错误发生时先回滚,然后再处理错误。

  2. 更好的事务管理:手动提交事务可以让程序员更好地控制它们的性质和生命周期,从而更好地管理它们。这也可以提高代码的可读性和可维护性。通过手动提交和回滚来控制事务,程序员可以更好地处理并发访问,并更轻松地确保数据的完整性和一致性。

  3. 提高性能:关闭自动提交可以显著提高事务性能。自动提交会在每个SQL语句执行后立即执行提交操作,这会导致 频繁的磁盘写入和网络通信。关闭自动提交可以使得多个操作在内存中连续执行,从而减少了I/O操作和网络通信的次数,提高了事务的速度。

综上,关闭MySQL的事务自动提交可以提高数据库操作的灵活性和安全性,提高事务管理和性能。

在MySQL中关闭事务自动提交可以带来以下好处:

  1. 确保数据的一致性:事务是为了保证数据的一致性而存在的,如果自动提交,当每个SQL语句执行完后,就会立即将其提交到数据库中,这样可能会导致数据不一致的情况。

  2. 提高性能:开启事务自动提交会导致 频繁的I/O操作,这样会 影响系统性能。而关闭事务自动提交可以将 多个SQL语句作为一个事务进行提交,减少I/O操作,提高系统性能。

  3. 防止误操作:开启事务自动提交可能会导致一些不可逆的误操作,如删除了错误的数据,而关闭事务自动提交可以让开发者有机会进行回滚操作,避免误操作对数据造成的影响。

  4. 更好的控制事务:关闭事务自动提交可以让 开发者 手动控制事务的提交和回滚,从而更好的控制事务的执行过程。

1、取消自动提交 :conn.setAutoCommit(false)

  • 我们的 java 程序是自动默认提交事物的,也就是自动执行我们的SQL语句,并操作数据库,只要我们点击  运行 按钮 ,java就会帮我们自动执行SQL语句,可是有时候我们不想让程序干预我们的操作,所以我们可以关闭提交事务。
package com.csdn.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TransactionSupport {
    public static void main(String[] args) {

        Connection conn = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql:///fruitdb", "root", "123456");

            String sql = "insert into t_fruit values(0,?,?,?,?)";
            String sql2 = "update t_fruit set price=99 where fid = ? ";

            //在创建预处理命令对象之前,取消自动提交
            conn.setAutoCommit(false);

            PreparedStatement psmt = conn.prepareStatement(sql);
            PreparedStatement psmt2 = conn.prepareStatement(sql2);

            psmt.setString(1,"西瓜");
            psmt.setInt(2, 23);
            psmt.setInt(3, 234);
            psmt.setString(4, "牛逼");

            psmt2.setInt(1, 2);

            psmt.executeUpdate();
            psmt2.executeUpdate();

//            conn.commit();

        } catch (ClassNotFoundException | SQLException e) {
            throw new RuntimeException(e);
        }


    }
}
  •  此时运行程序,数据库中的数据不会发生更改因为我们已经关闭事务,SQL语句不会被执行

 2、手动开启事务

  • 一旦手动开启事务,我们 的 所有SQL语句会放在 一个事务 中执行,要么一起成功,要么一起回滚
package com.csdn.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TransactionSupport {
    public static void main(String[] args) {

        Connection conn = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql:///fruitdb", "root", "123456");

            String sql = "insert into t_fruit values(0,?,?,?,?)";
            String sql2 = "update t_fruit set price=99 where fid = ? ";

            //在创建预处理命令对象之前,取消自动提交
            conn.setAutoCommit(false);

            PreparedStatement psmt = conn.prepareStatement(sql);
            PreparedStatement psmt2 = conn.prepareStatement(sql2);

            psmt.setString(1,"西瓜");
            psmt.setInt(2, 23);
            psmt.setInt(3, 234);
            psmt.setString(4, "牛逼");

            psmt2.setInt(1, 2);

            psmt.executeUpdate();
            psmt2.executeUpdate();

            conn.commit();

        } catch (ClassNotFoundException | SQLException e) {
            try {
                conn.rollback();
            } catch (SQLException ex) {
                throw new RuntimeException(ex);
            }
        }
        
    }
}

 jdbc 对事务的支持_第1张图片

你可能感兴趣的:(#,JDBC,数据库,jdbc,反射,java,IO流)