package com.yinbodotcc.Transaction;/* * 首先说明的是:这个例子里面的事务机制实在是凑出来的, * 目的就是为了体现自己编程在代码中如何细粒度实现事务控制。 */
import javax.sql.*;import java.util.*;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import org.springframework.transaction.TransactionDefinition;import org.springframework.transaction.support.DefaultTransactionDefinition;import org.springframework.transaction.TransactionStatus;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.transaction.support.TransactionTemplate;import org.springframework.transaction.support.TransactionCallbackWithoutResult;import org.springframework.dao.DataAccessException;
public class UserDao implements IUserDao {
private JdbcTemplate jdbcTemplate; private DataSourceTransactionManager dataSourceTransactionManager; private DefaultTransactionDefinition defaultTransactionDefinition; public void setDs(DataSource ds) {
jdbcTemplate=new JdbcTemplate(ds); defaultTransactionDefinition =new DefaultTransactionDefinition(); defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); dataSourceTransactionManager=new DataSourceTransactionManager(ds); } //TransactionManager实现了事务机制 public void insert(User user) { String name=user.getName(); int age=user.getAge(); TransactionStatus ts=dataSourceTransactionManager.getTransaction(defaultTransactionDefinition); String sql1="insert into user(name,age) values(?,?)"; try { jdbcTemplate.update(sql1, new Object[]{name,age}); jdbcTemplate.update(sql1, new Object[]{name,"hello"});//故意写错的,类型不匹配 } catch(Exception e) { dataSourceTransactionManager.rollback(ts); e.printStackTrace(); } dataSourceTransactionManager.commit(ts); } //TransactionTemplate体现事务处理机制 public User find(int id) { final int tempId=id; final User user=new User(); TransactionTemplate tt=new TransactionTemplate(dataSourceTransactionManager); tt.execute(new TransactionCallbackWithoutResult(){ public void doInTransactionWithoutResult(TransactionStatus status) { try { /* * 尽管这里会出现事务回滚,但是取出来的值赋给user以后,user就会拥有这个值 */ String sql="select * from user where id=?"; Map m=jdbcTemplate.queryForMap(sql,new Object[]{tempId}); int id=(Integer)m.get("id"); String name=(String)m.get("name"); int age=(Integer)m.get("age"); user.setAge(age); user.setId(id); user.setName(name); sql="insert into user(id,name,age) values(78,'dfx','hello')"; jdbcTemplate.execute(sql); } catch(DataAccessException e) { status.setRollbackOnly(); e.printStackTrace(); } } }); return user; } }