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(); } }