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>
阅读全文
0 0
- Spring学习笔记——事务
- Spring事务学习笔记
- Spring笔记——事务
- spring学习笔记(21)——声明式事务
- 7.JAVA后端学习笔记——Spring事务
- 学习笔记--spring事务特性
- spring学习笔记4--事务
- 学习笔记-------spring 事务控制
- spring学习笔记十八 事务
- 《Spring技术内幕》学习笔记14——Spring读取和处理事务配置
- 《Spring技术内幕》学习笔记16——Spring具体事务处理器的实现
- 《Spring技术内幕》学习笔记14——Spring读取和处理事务配置
- 《Spring技术内幕》学习笔记16——Spring具体事务处理器的实现
- Spring学习笔记——Spring事务只对运行时异常回滚
- 《Spring技术内幕》学习笔记——Spring具体事务处理器的实现
- 《Spring技术内幕》学习笔记14——Spring读取和处理事务配置
- 《Spring技术内幕》学习笔记16——Spring具体事务处理器的实现
- Spring学习笔记之Spring事务及事务测试
- How to Install Grub Customizer in Ubuntu 16.04 LTS
- python学习之路--内存管理
- 二叉树的非递归先序、中序、后序遍历
- NoSQL 简单介绍
- update去空处理
- Spring学习笔记——事务
- insert主键冲突控制
- Redis入门到精通-Redis与Java的应用
- 前段请求跨域的原理及实践
- MyBatis之优化配置文件
- return/exit/—exit三种返回方式的区别
- 二叉查找树
- c#一些常用关键字
- Redis入门到精通-Redis集群搭建