本文实例讲述了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); // 如果没有事务控制,则第一条记录可以被插入 // 如果增加事务控制,将发现第一条记录也插不进去。 } }