jdbc mysql commit_jdbc的commit和rollback

commit和rollback是数据库事务的两个概念。

一个数据库事务有开始和结束边界(boundary), 位于boundary的对数据库的各种操作认为是对该事务的操作。

一个事务的要占用数据库的一些资源,比如可能获得数据库的某个表的某条记录的lock,如果一个事务长期占用资源而不去释放,那么对其他的事务是不利的,可能会使得速度很慢。

所以对数据库操作的正确做法是让事务短小,只做一些应该在事务里边做的事情,以最快的速度让一个事务结束,从而释放该事务所占有的资源。

如何让一个事务结束?commit或者rollback。两者选其一,而且必选其一,才能够确保一个事务被可靠的,安全的终止。commit意味着对事务中的操作确定,rollback意味着对事务中的操作否定。

JDBC中如何正确的处理事务?

1。如果需要保持一些操作的原子性,比如转帐就需要原子性,那么必须要将这些操作放在一个事务中。

Connection conn = 。。。;

conn.setAutoCommit(false);

//从一个人那里扣钱

//往另一个人那里加钱

//做一些其他的事情,比如通过jms来广播一条成功的消息

conn.commit();

上面的代码看起来似乎完成了转帐的操作,其实需要的改进的地方很多。

1)不能保证上面的事务能够可靠的终止。

如果对数据库的扣钱,加钱操作失败,那么conn.commit()不会被执行。

2)通过jms来广播消息动作跟这个事务没有太大的关系,所以不应该放在事务中。试想如果jms广播需要花5s的时间,那么该事务结束的时间就要推迟5s,释放lock的时间也要被推迟5s!

正确的代码:

Connection conn = 。。。;

boolean success = false;

try{

conn.setAutoCommit(false);

//从一个人那里扣钱

//往另一个人那里加钱

conn.commit();

success = true;

}

catch(SQLException e){

conn.rollback();

success = false;

}

if(success)//做一些其他的事情,比如通过jms来广播一条成功的消息

2。如果不需要处理原子性的操作,比如查询,那么只需要conn.setAutoCommit(true);做就可以了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JDBC(Java Database Connectivity)是Java语言操作数据库的一种标准接口。它提供了一套用于连接和操作数据库的方法和规范。JDBC的底层原理涉及到数据库连接、事务和回滚操作。 1. 数据库连接:JDBC通过使用特定数据库的驱动程序来连接数据库。驱动程序是由数据库厂商提供的用于操作特定数据库的jar包。在连接数据库时,需要使用数据库的URL、用户名和密码等信息。 2. 事务:事务是一组数据库操作的逻辑单元,要么全部执行成功,要么全部回滚。JDBC通过使用Connection对象来管理事务。在开始事务之前,需要调用Connection对象的setAutoCommit(false)方法来关闭自动提交功能。 3. 回滚操作:回滚是指在事务执行过程中发生错误或者不满足某些条件时,将事务中的所有操作都撤销到事务开始之前的状态。JDBC通过使用Connection对象的rollback()方法来实现回滚操作。在发生错误或者不满足条件时,可以调用rollback()方法将事务回滚到之前的状态。 下面是一个使用JDBC进行事务和回滚操作的示例代码: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class JdbcRollbackExample { public static void main(String[] args) { Connection connection = null; Statement statement = null; try { // 1. 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 2. 建立数据库连接 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password"); // 3. 关闭自动提交 connection.setAutoCommit(false); // 4. 创建Statement对象 statement = connection.createStatement(); // 5. 执行SQL语句 statement.executeUpdate("INSERT INTO mytable (name, age) VALUES ('John', 25)"); statement.executeUpdate("INSERT INTO mytable (name, age) VALUES ('Jane', 30)"); // 6. 提交事务 connection.commit(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); try { // 7. 回滚事务 connection.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } finally { try { // 8. 关闭Statement和Connection对象 if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } ``` 这段代码演示了如何使用JDBC进行事务和回滚操作。在代码中,首先加载数据库驱动,然后建立数据库连接。接着关闭自动提交功能,创建Statement对象,并执行一些SQL语句。如果在执行过程中发生错误,会回滚事务,否则会提交事务。最后关闭Statement和Connection对象。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值