Spring管理事务方式

Spring管理事务方式
1.JDBC编程事务管理:可以清楚的控制事务的边界,事务控制粒度细化(编程的方式)
2.JDBC声明事务管理:事务相关API不用介入程序之中,将事务管理与实际业务代码解耦(配置XML的方式)

JDBC编程事务管理
    1.实现PlatformTransactionManager接口
Spring配置文件
<!-- Spring编程事务管理配置 -->
    <bean id="transactionmanager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean> 

Java代码
public static void main(String[] args) {
        // TODO Auto-generated method stub
        ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("applicationContext1.xml");
        //初始化事务
        PlatformTransactionManager ptm = (PlatformTransactionManager) cpx.getBean("transactionmanager");
        DefaultTransactionDefinition dtd = new DefaultTransactionDefinition();
        dtd.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus ts = ptm.getTransaction(dtd);
        //进行事务
        try{
            DataSource ds=(DataSource) cpx.getBean("dataSource");
            JdbcTemplate jt = new JdbcTemplate(ds);
            jt.execute("insert into JDBC_TEST values(4,'张三丰')");
            jt.execute("insert into JDBC_TEST values(3,'周芷若')");
            ptm.commit(ts);
        }catch(Exception e){
            ptm.rollback(ts);
            e.printStackTrace();
        }
    } 


  2.使用事务模板Transactiontemplate
public static void main(String[] args) {
        // TODO Auto-generated method stub
        ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("applicationContext1.xml");
        //第二种使用事务模板Transactiontemplate
        
 PlatformTransactionManager ptm = (PlatformTransactionManager) cpx.getBean("transactionmanager");
        TransactionTemplate tt = new TransactionTemplate(ptm);
        DataSource ds = (DataSource) cpx.getBean("dataSource");
        final JdbcTemplate jt = new JdbcTemplate(ds);
        
        tt.execute(new TransactionCallbackWithoutResult() {
            
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus arg0) {
                jt.execute("insert into JDBC_TEST values(4,'张三丰')");
                jt.execute("insert into JDBC_TEST values(4,'周芷若')");
            }
        });
    }

JDBC编程事务管理  缺点
浸入代码,改变之后需改动代码,灵活度不够


Spring 声明事务管理
1.设置person.java实体类
public class Person {
    private Long id;
    private String name;
    private int age;
    
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}


2.设置数据库操作接口
public interface PersonDao {
        public void insert(long id, String name, int age);
        public void batchInsert(List persons);
}


3.设置接口实现类(模拟循环插入多条数据)
public class PersonDaoImpl implements PersonDao{
    private JdbcTemplate jt;
    
    public void setDataSource(DataSource dataSource){
        this.jt = new JdbcTemplate(dataSource);
    }
    
    @Override
    public void insert(long id, String name, int age) {
        jt.update("insert into person values('" + id +"'," + name +  "," + age + ")");
    }
    @Override
    public void batchInsert(List persons) {
        for(Iterator it = persons.iterator();it.hasNext();){
            Person p = (Person) it.next();
            insert(p.getId(),p.getName(),p.getAge());
        }
    }
}


4.修改Spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:context="http://www.springframework.org/schema/context"
          xmlns:aop="http://www.springframework.org/schema/aop"    
          xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
              http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
              http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
  
  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>oracle.jdbc.driver.OracleDriver</value>
        </property>
        <property name="url">
            <value>jdbc:oracle:thin:@localhost:1521:ORCL</value>
        </property>
        <property name="username">
            <value>TEST_USER</value>
        </property>
        <property name="password">
            <value>lixin</value>
        </property>
    </bean>
    
    <bean id="personDao" class="com.pb.person.Spring.transaction.PersonDaoImpl">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- Spring编程事务管理配置 -->
    <bean id="transactionmanager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
<!-- 传统方式-->
    <bean id="personDaoProxyBean"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="proxyInterfaces">
            <list>
                <!-- 指定代理接口 -->
                <value>com.pb.person.Spring.transaction.PersonDao</value>
            </list>
        </property>
        <!-- 指定被代理的bean -->
        <property name="target" ref="personDao" />
        <!-- 注入事务管理 -->
        <property name="transactionManager"  ref="transactionManager"/>
        <!-- 事务管理被代理Bean的具体方法以及方式 -->
        <property name="transactionAttributes">                        
            <props>
                <prop key="batch*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>
</beans> 


5.编写测试类 
public static void main(String[] args) {
        ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //必须调用代理Bean
        PersonDao personDao = (PersonDao) cpx.getBean("personDaoProxyBean");
        
        Person p1 = new Person();
        Person p2 = new Person();
        p1.setId(23);
        p1.setName("朱雀");
        p1.setAge(199);
        p2.setId(11);
        p2.setName("玄武");
        p2.setAge(150);
        List persons = new ArrayList();
        persons.add(p1);
        persons.add(p2);
        personDao.batchInsert(persons);
    }  

使用XML Schema声明事务管理
1.加入相关的XML命名空间
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
"

2.将上述配置文件中“传统方式”部分换成
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="batch*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="personDaoPC"
expression = "execution(* demo.spring.dao.PersonDAO.*(..))"
/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="personDaoPC" />
</aop:config>

3.测试类调用Bean时调用
 //必须调用代理Bean
 
       PersonDao personDao = (PersonDao) cpx.getBean("personDao");


就可以了
使用注解声明事务管理
主要使用@Transactionl来标示
1.修改接口的实现类如下(加注解)


@Transactional
public class PersonDaoImpl implements PersonDAO {


private JdbcTemplate jt;


public void setDataSource(DataSource dataSource){
jt = new JdbcTemplate(dataSource);
}
public void insert(long id, String name, int age) {


jt.update("insert into person values('" + name +"'," + age +  "," + id + ")");
}
@Transactional(propagation = Propagation.REQUIRED)
public void batchInsert(List persons) {
for(Iterator it = persons.iterator();it.hasNext();){
Person p = (Person) it.next();
insert(p.getId(),p.getName(),p.getAge());
}
}
}


2.修改配置文件

将“传统方式”换成


<tx:annotation-driven transaction-manager="transactionManager"/>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值