当前位置 主页 > 网站技术 > 代码类 >

    Spring实战之使用注解实现声明式事务操作示例

    栏目:代码类 时间:2020-01-16 09:05

    本文实例讲述了Spring实战之使用注解实现声明式事务操作。分享给大家供大家参考,具体如下:

    一 配置文件

    <?xml version="1.0" encoding="GBK"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       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-4.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
       <!-- 定义数据源Bean,使用C3P0数据源实现,并注入数据源的必要信息 -->
       <bean  class="com.mchange.v2.c3p0.ComboPooledDataSource"
          destroy-method="close"
          p:driverClass="com.mysql.jdbc.Driver"
          p:jdbcUrl="jdbc:mysql://localhost/spring"
          p:user="root"
          p:password="32147"
          p:maxPoolSize="40"
          p:minPoolSize="2"
          p:initialPoolSize="2"
          p:maxIdleTime="30"/>
       <!-- 配置一个业务逻辑Bean -->
       <bean  class="org.crazyit.app.dao.impl.NewsDaoImpl"
          p:ds-ref="dataSource"/>
       <!-- 配置JDBC数据源的局部事务管理器,使用DataSourceTransactionManager 类 -->
       <!-- 该类实现PlatformTransactionManager接口,是针对采用数据源连接的特定实现-->
       <!-- 配置DataSourceTransactionManager时需要依注入DataSource的引用 -->
       <bean 
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
          p:dataSource-ref="dataSource"/>
       <!-- 根据Annotation来生成事务代理 -->
       <tx:annotation-driven transaction-manager="transactionManager"/>
    </beans>
    
    

    二 DAO

    1 接口

    package org.crazyit.app.dao;
    public interface NewsDao
    {
       public void insert(String title, String content);
    }
    
    

    2 实现类

    package org.crazyit.app.dao.impl;
    import javax.sql.DataSource;
    import java.sql.Connection;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.transaction.annotation.*;
    import org.crazyit.app.dao.*;
    public class NewsDaoImpl implements NewsDao
    {
      private DataSource ds;
      public void setDs(DataSource ds)
      {
        this.ds = ds;
      }
      @Transactional(propagation=Propagation.REQUIRED ,
        isolation=Isolation.DEFAULT , timeout=5)
      public void insert(String title, String content)
      {
        JdbcTemplate jt = new JdbcTemplate(ds);
        jt.update("insert into news_inf"
          + " values(null , ? , ?)"
          , title , content);
        // 两次插入的数据违反唯一键约束
        jt.update("insert into news_inf"
          + " values(null , ? , ?)"
          , title , content);
        // 如果没有事务控制,则第一条记录可以被插入
        // 如果增加事务控制,将发现第一条记录也插不进去。
      }
    }