TransactionTemplate这个类是Spring的事务处理模板,在它的execute()方法里定义事务处理的骨架代码.java
但execute()方法的TransactionCallback参数倒是个接口,在这接口中定义了doInTransaction()方法spring
只要实现TransactionCallback接口,并在doInTransaction()方法里编写具体要进行的事务处理的代码就能够 了.sql
代码截图ide
import java.sql.ResultSet; import java.sql.SQLException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; import com.sunflower.entity.People; public class BankDaoImp implements BankDao { private JdbcTemplate jdbcTemplate; private TransactionTemplate transactionTemplate; public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public TransactionTemplate getTransactionTemplate() { return transactionTemplate; } public void setTransactionTemplate(TransactionTemplate transactionTemplate) { this.transactionTemplate = transactionTemplate; } @Override public double getMoney(final People people) { double money = people.getMoney(); // 开始事务,若是出现情况则回滚 transactionTemplate.execute(new TransactionCallback<People>() { @Override public People doInTransaction(TransactionStatus ts) { try { final People people2 = new People(); // 使用JdbcTemplate进行持久化层操做 String sql = "select money from bank where name = ?"; Object[] params = new Object[] { people.getName() }; // 查询 jdbcTemplate.query(sql, params, new RowCallbackHandler() { @Override public void processRow(ResultSet rs) throws SQLException { people2.setMoney(rs.getDouble("money")); System.out.println(people.getName() + "用户还有" + rs.getDouble("money") + "元余款"); System.out.println(people.getName() + "要从帐户中取出" + people.getMoney() + "元"); if (people2.getMoney() < people.getMoney()) { System.out.println("余额不足"); people.setMoney(-1); return; } } }); if (people.getMoney() < 0) return null; else { sql = "update bank set money = ? where name = ?"; Object[] params2 = new Object[] { people2.getMoney() - people.getMoney(), people.getName() }; jdbcTemplate.update(sql, params2); System.out.println("剩余余额:" + (people2.getMoney() - people.getMoney())); } } catch (Exception e) { ts.setRollbackOnly(); } // 若是成功,事务被提交 return people; } }); return people.getMoney(); } }