Spring学习笔记——事务

来源:互联网 发布:linux exp continue 编辑:程序博客网 时间:2024/05/22 04:45

1.1事务中的基本概念

     事务是指逻辑上的一组操作要么全部成功,要么全部失败

      

1.2 Spring管理事物的接口

PlatformTransactionManager:平台事务管理
*******真正管理事物的对象
    org.springframework.jdbc.datasource.DataSourceTransactionManager:使用JDBC或mybatis持久化数据时使用
    org.springframework.orm.hibernate5.HibernateTransactionManager:使用Hibernate持久化数据时使用

1.3 Spring声明式事务的实例    

(编程时事务省略)
dao层
package com.zhfy.project.dao.impl;import org.springframework.jdbc.core.support.JdbcDaoSupport;import com.zhfy.project.dao.IUserDao;public class UserDaoImpl extends JdbcDaoSupport implements IUserDao{public void increaseMoney(Integer id, Double money) {getJdbcTemplate().update("update t_user set money = money+? where id = ? ", money,id);}public void decreaseMoney(Integer id, Double money) {getJdbcTemplate().update("update t_user set money = money-? where id = ? ", money,id);}}

service层
package com.zhfy.project.service.impl;import org.springframework.transaction.TransactionStatus;import org.springframework.transaction.support.TransactionCallbackWithoutResult;import org.springframework.transaction.support.TransactionTemplate;import com.zhfy.project.dao.IUserDao;import com.zhfy.project.service.IUserService;public class UserServiceImpl implements IUserService {private IUserDao userDao;private TransactionTemplate tt;public void transfer(final Integer from,final Integer to,final Double money) {tt.execute(new TransactionCallbackWithoutResult() {@Overrideprotected void doInTransactionWithoutResult(TransactionStatus arg0) {//减钱userDao.decreaseMoney(from, money);int i = 1/0;//加钱userDao.increaseMoney(to, money);}});}public IUserDao getUserDao() {return userDao;}public void setUserDao(IUserDao userDao) {this.userDao = userDao;}public TransactionTemplate getTt() {return tt;}public void setTt(TransactionTemplate tt) {this.tt = tt;}}
配置文件
<?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:aop="http://www.springframework.org/schema/aop"       xmlns:tx="http://www.springframework.org/schema/tx"       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans.xsd   http://www.springframework.org/schema/tx    http://www.springframework.org/schema/tx/spring-tx.xsd   http://www.springframework.org/schema/aop    http://www.springframework.org/schema/aop/spring-aop.xsd   http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context.xsd">  <!-- 事务核心管理器,封装了所有事务操作. 依赖于连接池 --><bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" ><property name="dataSource" ref="dataSource" ></property></bean><!-- 事务模板对象 --><bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate" ><property name="transactionManager" ref="transactionManager" ></property></bean><!-- 配置事务通知 --><tx:advice id="txAdvice" transaction-manager="transactionManager" ><tx:attributes><!-- 以方法为单位,指定方法应用什么事务属性isolation:隔离级别propagation:传播行为read-only:是否只读 --><tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /><tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /><tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /><tx:method name="modify*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /><tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /><tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /><tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" /><tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" /><tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /></tx:attributes></tx:advice><!-- 配置织入 --><aop:config  ><!-- 配置切点表达式 --><aop:pointcut expression="execution(* com.zhfy.project.service.impl.*ServiceImpl.*(..))" id="txPc"/><!-- 配置切面 : 通知+切点 advice-ref:通知的名称 pointcut-ref:切点的名称 --><aop:advisor advice-ref="txAdvice" pointcut-ref="txPc" /></aop:config>       <bean name="userDao" class="com.zhfy.project.dao.impl.UserDaoImpl">    <property name="dataSource" ref="dataSource" ></property>     </bean>  <bean name="userservice" class="com.zhfy.project.service.impl.UserServiceImpl">   <property name="userDao" ref="userDao"></property>   <property name="tt" ref="transactionTemplate" ></property> </bean>   <!-- 指定spring读取db.properties配置 -->     <context:property-placeholder location="classpath:db.properties"  />  <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">    <property name="jdbcUrl" value="${jdbc.jdbcUrl}" ></property><property name="driverClass" value="${jdbc.driverClass}" ></property><property name="user" value="${jdbc.user}" ></property><property name="password" value="${jdbc.password}" ></property> </bean></beans>
测试
package com.zhfy.project.test;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.zhfy.project.service.IUserService;public class myProjectTest {@Testpublic void test(){//加载配置文件,创建容器ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContextTX.xml");//想容器中要对象        IUserService userService = (IUserService)ac.getBean("userservice");        userService.transfer(1, 2, 10.0);  } }

1.4注解方式的声明试事务

service层
package com.zhfy.project.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.transaction.annotation.Transactional;import org.springframework.transaction.support.TransactionTemplate;import com.zhfy.project.dao.IUserDao;import com.zhfy.project.service.IUserService;public class UserServiceImpl implements IUserService {@Autowiredprivate IUserDao userDao;@Autowiredprivate TransactionTemplate tt;@Transactionalpublic void transfer( Integer from,Integer to, Double money) {//减钱userDao.decreaseMoney(from, money);int i = 1/0;//加钱userDao.increaseMoney(to, money);}public IUserDao getUserDao() {return userDao;}public void setUserDao(IUserDao userDao) {this.userDao = userDao;}public TransactionTemplate getTt() {return tt;}public void setTt(TransactionTemplate tt) {this.tt = tt;}}

配置文件
<?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:aop="http://www.springframework.org/schema/aop"       xmlns:tx="http://www.springframework.org/schema/tx"       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans.xsd   http://www.springframework.org/schema/tx    http://www.springframework.org/schema/tx/spring-tx.xsd   http://www.springframework.org/schema/aop    http://www.springframework.org/schema/aop/spring-aop.xsd   http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context.xsd">  <!-- 事务核心管理器,封装了所有事务操作. 依赖于连接池 --><bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" ><property name="dataSource" ref="dataSource" ></property></bean><!-- 事务模板对象 --><bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate" ><property name="transactionManager" ref="transactionManager" ></property></bean>  <!-- 开启使用注解管理aop事务 -->     <tx:annotation-driven/>     <bean name="userDao" class="com.zhfy.project.dao.impl.UserDaoImpl">    <property name="dataSource" ref="dataSource" ></property>     </bean>  <bean name="userservice" class="com.zhfy.project.service.impl.UserServiceImpl">   <property name="userDao" ref="userDao"></property>   <property name="tt" ref="transactionTemplate" ></property> </bean>   <!-- 指定spring读取db.properties配置 -->     <context:property-placeholder location="classpath:db.properties"  />  <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">    <property name="jdbcUrl" value="${jdbc.jdbcUrl}" ></property><property name="driverClass" value="${jdbc.driverClass}" ></property><property name="user" value="${jdbc.user}" ></property><property name="password" value="${jdbc.password}" ></property> </bean></beans>