Programmatic JDBC事务处理

    技术2022-05-11  79

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


    最新回复(0)