主要是两个方面:
一是开始事务
conn.setAutoCommit(false);默认是true
二是提交事务
conn.commit();
一、创建一个类
连接数据库的方法封装在Util包中,获取Connection连接。该类的功能是通过id修改表t_emp 中对应id的acount的值。
使用Connection的preparestatement方法。
public class AcountDao { public void update(Connection conn,Integer id,Integer count) { String sql="update t_emp set acount=acount+? where id=?"; PreparedStatement ps=null; try { ps = conn.prepareStatement(sql); ps.setInt(1, count); ps.setInt(2, id); ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
二、创建一个测试类JUnit Test Case
private AcountDao acountdao=new AcountDao(); @Test public void testUpdate() { Connection conn=null;//一个connection对象 conn=Util.getConn(); try { // 开启事务,需要手动提交 conn.setAutoCommit(false);
// 孙悟空向猪八戒转账100元 acountdao.update(conn,1, -100);//一个connection对象 int aa=10/0;
// 猪八戒收到孙悟空的转账的100元 acountdao.update(conn,2, 100);//一个connection对象 // 提交事务 conn.commit(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
这里需要注意:我们前后
acountdao.update();方法中都有Connection,加上程序刚开始创建的Connection对象,总共是有3个Connection对象。我们要保持着3个
Connection对象是同一个Connection对象。
当孙悟空转账后出现了错误,提交的事务的方法就可以回滚,即将执行的操作向回翻滚,回滚到开始事务的时刻,就相当于从来没有执行过。