1.事务是什么及为什么使用事务
事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据修改均被清除。
例如:
我要修改一个旅游产品,首先是根据productId查出对应的团队游产品,然后根据productId查询出对应的行程信息表并进行修改,保存;然后再根据productId查出价格表,再进行修改,保存;当以上的两个动作我都完成之后(并且成功完成),这个产品修改就算完成了!假如其中之一修改失败,即产品修改失败!这个时候我就可以用到事务去控制了,要么成功(commit),要么失败(roolback)。
2.demo
spring-hibernate.xml:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" abstract="false" //sessionFactory注入hibernatePropertities,mappingResources,以及lobHandler singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="dataSource"> <ref local="dataSource"/> </property> <!-- --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.cache.use_minimal_puts">false</prop> <prop key="hibernate.cache.use_query_cache">false</prop> <prop key="hibernate.cache.use_second_level_cache">false</prop> <prop key="hibernate.connection.SetBigStringTryClob">true</prop> </props> </property> <property name="mappingResources"> <list> <value>com/joey/framework/persistence/MenuItem.hbm.xml</value> <value>com/joey/security/persistence/mapping/LogHistory.hbm.xml</value> <value>com/ctol/mango/pge/productmanager/persistence/mapping/ScheduledFlight.hbm.xml</value> </list> </property> <property name="lobHandler"> <ref bean="oracleLobHandler" /> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" // transactionManager注入了sessionFactory,HibernateTransactionManager 在后面博客会讲到 abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> <bean id="baseTransactionProxy" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" singleton="true" // TransactionProxyFactoryBean为事务代理,注入了tracsactionManager和transactionAttributes lazy-init="default" autowire="default" dependency-check="default"> <property name="transactionManager"> <ref bean="transactionManager"/> </property> <property name="transactionAttributes"> <props> <!-- <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>--> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="list*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean>
spring-factory.xml:
<bean id="providerFacade" parent="baseTransactionProxy" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="target"> <bean class="com.ctol.mango.pge.productmanager.business.facade.impl.ProviderFacadeImpl" parent="facade" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="providerDAO"> <ref bean="providerDAO"/> </property> </bean> </property> </bean>
则ProviderFacadeImpl这个实现类已使用了事务控制!
一般spring事务管理放在service层,因为dao层一般都是比较细粒度话的操作,而service可以是比较复杂的增删改查!并且用spring管理事务,只需要在配置文件配置即可,无需在service层代码中每次都显式调用,节省了代码量!
诸如:
session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
……
tx.commit();
Transaction tx = session.beginTransaction();
……
tx.commit();
或者:
Connection dbconn = getConnection(); dbconn.setAutoCommit(false); …… dbconn.commit();
相关推荐
Spring事务管理Demo
spring 事务传播 demo
spring声明式事务处理demo。myeclipse工程
讲述spring事务机制,aopafter,aopbefore,aopmethodintercept,4个例子
这是一个Spring+Mybatis+Mysqls的Java程序,主要是用来学习Spring的事务的,感兴趣的可以下载。
spring 事务传播与隔离级别DEMO 脏读、重复读、幻影读 spring 事务传播与隔离级别DEMO 脏读、重复读、幻影读
参考博客https://blog.csdn.net/qq_42192693/article/details/91359997,用到的模型
使用Spring Cloud微服务架构 阿里巴巴开源Seate处理分布式程序事务一致性问题demo 使用IDEA开发
测试spring事务管理 搭建了ssh框架的web工程 本工程用到的数据库表很简单 user(id, name) 可自行创建 本例所有的事务放在service层进行管理,方法中间抛出运行时异常以测试是否回滚 Spring配置文件中关于事务...
声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。spring注解事务实现demo
spring+ibatis声明式事务Demo
spring+ibatis声明式事务Demo源码
2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的...
Spring事务管理4种方式 入门级 最简单demo PlatformTransactionManager TransactionTemplate
开发工具IntelliJ IDEA15,maven构建工程,使用spring4.1.1,demo集成jackson传输json,hibernate-validator校验数据,mybatis数据库持久框架,拦截器interceptor,aop构建事务等,让你快速入门spring
spring+springmvc+mybatis+log4j+springtest的demo,并且配置了多环境的配置文件,xml文件在源码中,配置了service层的事务处理,
本工程以“银行账号转账”为例子演示了如何处理Spring、Ibatis结合MySQL数据库使用时的事务操作 本工程编码方式:UTF-8 须执行的SQL语句: CREATE DATABASE `test`; USE `test`; CREATE TABLE `lm_bank_card` ( `...
spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo
spring mybatis atomikos 分布式事务 自己写的小demo 包含依赖包
Spring事务管理A方法内部调用B方法的回滚问题测试代码