Programmatic JDBC事务处理

来源:互联网 发布:pagerank算法实现 编辑:程序博客网 时间:2024/05/06 15:10

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

原创粉丝点击