假如银行转账系统
从小三的账户转1000元到小四的账户
这个操作需要分两步
1.小三账户减少1000元
2.小四账户增加1000元
假如于到断电等等,而刚好小三减了1000,而此时小四却不增加。。。。
(2)
java使用事务非常简单,首先调用
conn.setAutoCommit(boolean b)方法,传入一个false,这样将不会自动提交,而需要使用
conn.commit()方法,手动提交事务,当然只有在确认两个步骤都没有出错的情况下,才能提交,这样才能保证整个操作的完整性,一旦出错,使用
conn.rollback()方法,回滚事务,这样的话,整个事务都将不被提交。那么如何判断有没有出错呢,非常简单,执行数据库操作的方法,都会抛出java.sql.SQLException,
所以需要使用try……catch语句块捕获异常,在catch块中,使用conn.rollback()回滚事务即可
在数据库调用的javabean中conn.setAutoCommit()的功能是每执行一条SQL语句,就作为一次事务提交。但一般在项目中很有可能需要执行多条SQL语句作为一个事务。若有一个执行不成功,就会rollback();
一般来讲,大家对数据库中的表单,主要是增、删、改、查这四个操作,如果你的程序当中,遇到一次业务逻辑需要两次或两次以上的对相同数据表的增删改操作,那么,为了数据的一致性,(或者具体说,在你的一次业务逻辑的处理过程中,其他(线程或程序或业务处理)的对相同数据的相同两次查询所得结果相同。)我们会利用数据库的事务操作,将一次业务逻辑所包含的所有操作封装在一个事务里,一次将多个操作进行提交。
而conn的setAutoCommit方法,是指,在事务当中,是否执行一条语句就自动提交一次。
想在一个事务里进行多个操作。就必然将setAutoCommit的参数设置成false,在多个操作的最后调用conn.commit()方法,进行手动提交
注意:
你设置方法参数为false
则在你执行整个查询SQL期间,一直是没有事务的,(即当你设置方法参数为false时,查询调用函数、存储过程等时,有可能因为不在同一事务下,而使查询结果不一样)
而你设置为true,则没有任何问题了,读一致性将保证不会出现问题。(即一次操作为一次事务)
分享到:
相关推荐
7. **事务管理**: JDBC支持事务控制,如`conn.setAutoCommit(false)`可以禁用自动提交,然后手动调用`conn.commit()`或`conn.rollback()`来提交或回滚事务。 8. **异常处理**: 在数据库操作中,应妥善处理`...
- 关闭自动提交:`conn.setAutoCommit(false);` - 添加SQL语句到批处理:`stmt.addBatch("SQL语句");` - 执行批处理:`stmt.executeBatch();` - 提交更改:`conn.commit();` 2. **使用PreparedStatement对象...
conn.setAutoCommit(false); // 关闭自动提交 PreparedStatement pstmt = conn.prepareStatement("update content set introtext=? where id=?"); pstmt.setString(1, tempIntroText); pstmt.setInt(2, id); pstmt...
conn.setAutoCommit(false); } public static void commitTransaction(Connection conn) throws SQLException { conn.commit(); conn.setAutoCommit(true); } public static void rollbackTransaction...
conn.setAutoCommit(false); // 开始事务 // 执行数据访问操作 conn.commit(); // 提交事务 } catch (Exception e) { conn.rollback(); // 回滚事务 } } ``` ##### 3.2 外部事务管理 将事务管理放在调用DAO...
conn.setAutoCommit(false); try { // 执行数据库操作 conn.commit(); } catch (SQLException e) { conn.rollback(); e.printStackTrace(); } finally { conn.setAutoCommit(true); } ``` 此外,JDBC 4.0引入...
conn.setAutoCommit(false); try { // 提交批处理 statement.executeBatch(); // 若批处理无异常,则准备手动commit conn.commit(); } catch (Exception e) { e.printStackTrace(); // 批处理抛异常...
conn.setAutoCommit(false); // 关闭自动提交 try { // 批处理代码... conn.commit(); // 提交事务 } catch (Exception e) { conn.rollback(); // 如果有异常,回滚事务 } finally { conn.setAutoCommit(true); ...
conn.setAutoCommit(false); Dao1 dao1 = new Dao1(conn); dao1.doSomething(); Dao2 dao2 = new Dao2(conn); dao2.doSomething(); Dao3 dao3 = new Dao3(conn); dao3.doSomething(); conn.commit(); } ...
conn.setAutoCommit(false); // 关闭自动提交 Statement stmt = conn.createStatement(); String sql1 = "UPDATE account_ning SET money=money-500 WHERE id='A'"; String sql2 = "UPDATE account_ning SET money=...
- 关闭事务模式:`conn.setAutoCommit(true);` 5. JDBC优化技巧: - 使用PreparedStatement避免SQL注入。 - 使用批处理提高性能:`pstmt.addBatch()` 和 `pstmt.executeBatch();` - 使用连接池管理数据库连接,...
conn.setAutoCommit(false); // 关闭自动提交 try { // 执行数据库操作 conn.commit(); // 提交事务 } catch (Exception e) { conn.rollback(); // 回滚事务 } finally { conn.setAutoCommit(true); // 恢复自动...
conn.setAutoCommit(false); // 关闭自动提交 try { String sql1 = "UPDATE users SET balance = balance - 100 WHERE username = 'Alice'"; String sql2 = "UPDATE users SET balance = balance + 100 WHERE ...
conn.setAutoCommit(false); try { // SQL操作... conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚事务 } finally { conn.setAutoCommit(true); // 恢复自动提交 } ``` 此外...
conn.setAutoCommit(false); // 关闭自动提交 try { // SQL操作... conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚事务 e.printStackTrace(); } finally { conn....
conn.setAutoCommit(false); Statement stat = conn.createStatement(); for (Object o : sql) { stat.addBatch(o.toString()); } stat.executeBatch(); conn.commit(); sign = true; } ...
conn.setAutoCommit(false); try { // 执行一系列操作 conn.commit(); } catch (Exception e) { conn.rollback(); throw new RuntimeException("Transaction failed", e); } finally { conn.setAutoCommit(true...
conn.setAutoCommit(false); // 关闭自动提交 try { // 执行SQL操作 conn.commit(); // 提交事务 } catch (Exception e) { conn.rollback(); // 如果发生错误,回滚事务 } finally { conn.setAutoCommit(true); ...