JDBC 事务

9 篇文章 0 订阅

      事务的开启是由JDBC驱动或数据库隐式决定的。Connection对象的autoCommit属性决定什么时候结束一个事务。启动自动提交后,会在每个SQL语句执行完毕后自动提交事务,当Connection对象创建时,默认情况下,事务提交是自动开启的。Connection接口中提供setAutoCommit()方法,可以禁用自动提交。此时,需要显示的调用Connection提供的commit()方法提交事务或rollback()回滚事务。

     事务隔离级别用于指定事务中对数据的操作对其它事务的“可见性”。不同的事务隔离级别能够解决并发访问数据带来的不同的并发问题,而且会直接影响并发访问效率,数据并发访问可能会导致如下问题:

     脏读:这种情况发生在事务中允许读取未提交的数据。例如,A事务修改了一条数据,但是未提交修改,此时A事务对数据的修改对其他事务是可见的,B事务中能够读取A事务未提交的修改。一旦A事务回滚,则B事务中读取的就是不正确的数据。

    不可重复读:这种情况发生在如下场景:

        1 A事务中读取一行数据

        2 B事务修改了该行数据

        3 A事务中再次读取该行数据将得到不同的结果。

   幻读:这种情况发生在如下场景:

       1 A事务中通过where条件读取若干行。

       2 B事务中插入了符合条件的若干新记录。

       3 A事务中通过相同条件再次读取数据时将会读取到B事务中插入的数据。

JDBC中定义了5种隔离级别:

   ·  TRANSACTION_NONE: 表示不支持事务,这意味着它是不兼容JDBC规范的驱动。

   · TRANSACTION_READ_UNCOMMITTED: 允许事务读取未提交更改的数据,这意味着可能会出现脏读、不可重复读和幻读。

    · TRANSACTION_READ_COMMITTED: 表示在事务中进行的任何数据更改,在提交事务之前对其它事务是不可见的。可以防止脏读,但是不能解决幻读和不可重复读。

   · TRANSACTION_REPEATABLE_READ: 顾名思义,该隔离级别能够解决脏读和不可重复读,但是不能解决幻读问题。

  · TRANSACTION_SERIALIZABLE: 所有事务串行执行,能够有效解决脏读、不可重复读和幻读的问题,但是并发效率较低。

 try {
            connection.setAutoCommit(false);//设置手动提交事务
            String sql1="insert into t_log(logMess,logTime) values('好好学习',now())";
            String sql2="insert into t_log(logMess,logTime) values('天天向上',now())";
            smt= connection.createStatement();
            smt.executeUpdate(sql1);//执行第一个sql
            Savepoint savepoint = connection.setSavepoint("sp1");//设置事务保存点,事务可以回滚到该保存点
            smt.executeUpdate(sql2);//执行第二个sql
            connection.rollback(savepoint);//回滚到保存点
            connection.commit();//提交事务,此时数据库中只插入的第一条数据

        } catch (SQLException e) {
            e.printStackTrace();
        }
try {
            connection.setAutoCommit(false);//设置手动提交事务
            Savepoint savepoint = connection.setSavepoint("sp1");//设置事务保存点,事务可以回滚到该保存点
            String sql1="insert into t_log(logMess,logTime) values('好好学习',now())";
            String sql2="insert into t_log(logMess,logTime) values('天天向上',now())";
            smt= connection.createStatement();
            int m= smt.executeUpdate(sql1);//执行第一个sql
            m+=smt.executeUpdate(sql2);//执行第二个sql
            if(m>=2){//如果都成功则,提交事务
                connection.commit();//提交事务,此时数据库中只插入的第一条数据
            }else {//有任何一个失败,则回滚事务
                connection.rollback(savepoint);//回滚到保存点
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java的JDBC事务是一种机制,用于控制数据库操作的一组相关操作,可以确保数据库的完整性和一致性。 JDBC事务需要通过以下步骤进行管理: 1. 打开数据库连接:在执行任何数据库操作之前,必须首先打开与数据库的连接。可以使用JDBC提供的DriverManager类的getConnection()方法来建立连接。 2. 开始事务:一旦连接成功建立,就可以开始事务。通过将连接的setAutoCommit()方法设置为false来禁用自动提交。 3. 执行数据库操作:在事务,可以执行多个数据库操作(如插入、更新、删除等)。所有这些操作都将被视为一个原子操作,要么全部成功执行,要么全部回滚。 4. 提交事务:当所有数据库操作都成功执行时,可以通过调用连接的commit()方法来提交事务。这将导致所有在事务进行的操作永久性地保存到数据库。 5. 回滚事务:如果在事务的任何操作失败或出现异常,可以通过调用连接的rollback()方法来回滚事务。这将导致在事务发生的所有操作被撤消,数据库回到事务开始之前的状态。 6. 关闭连接:无论事务提交还是回滚,都需要最终关闭数据库的连接。这可以通过调用连接的close()方法来完成。 JDBC事务的好处包括:确保数据一致性,防止数据丢失或不一致;提高数据操作性能,通过将多个操作作为一个原子操作来减少网络开销;增加数据安全性,可以使用事务来保护敏感数据。 总的来说,JDBC事务是一种用于管理数据库操作的机制,可以确保数据库的完整性和一致性,并提供了多个操作的原子性,从而提高了数据的安全性和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值