spring中的事物都有哪些
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring中的事物都有哪些相关的知识,希望对你有一定的参考价值。
事务属性Spring中事务属性是对事务策略如何应用到方法的描述,这个描述包括下列参数:
传播行为
定义了关于客户端和被调用方法的事务边界,Spring中有7种不同的值
(1)propagation_mandatory方法必须在事务中,没有事务则异常
(2)propagation_nested如果有事务则嵌套,没有则和required相同
(3)propagation_never不在事务中,若有事务则异常
(4)propagation_not_supported方法不在事务中,若有事务,方法运行期间事务挂起
(5)propagation_required必须在事务中,如果没有创建新的事务
(6)propagation_requires_new必运行在自己的事务中,若有事务则方法运行期间挂起
(7)propagation_supports不需要事务,但如果有事务,也可运行在事务中
隔离级别
多个事务同时访问一个数据,就会造成脏读dirty read,不可重复读nonrepeatedable read,幻读phantom read
Spring有5种隔离级别
(1)isolation_default使用数据的隔离级别
(2)isolation_read_uncommited运行脏读,幻读和不可重复读
(3)isolation_read_commited运行并发事务提交后读取,避免脏读
(4)isolation_repeatable_read对相同数据多次读取结果一致,防止脏读,不可重复读
(5)isolation_serializable完全服从ACID隔离级别,完全锁定在事务中涉及的所有表 参考技术A 一般事务简单的讲就是对数据库表的添加、删除、修改和查询操作。。。
事务具有原子性
事务中包含的添加、删除、更新等操作要么全部做完
要么全部都不做,以保证数据库的一致性和正确性
举个例子说:银行账户,你首先查看还有1000元,然后你要取500元钱,在你取钱时取款机出问题,你没能取成500元钱,这时就会回滚,不会说因为这样你下次再查看的时候就只有500了 参考技术B 蓝天,白云,红花,绿草 参考技术C 一般事务简单的讲就是对数据库表的添加、删除、修改和查询操作。。。
事务具有原子性
事务中包含的添加、删除、更新等操作要么全部做完
要么全部都不做,以保证数据库的一致性和正确性
举个例子说:银行账户,你首先查看还有1000元,然后你要取500元钱,在你取钱时取款机出问题,你没能取成500元钱,这时就会回滚,不会说因为这样你下次再查看的时候就只有500了
spring 事务实现方式都有哪些?
第一种方式:每个Bean都有一个代理
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置DAO -->
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="userDao"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 配置事务管理器 -->
<property name="transactionManager" ref="transactionManager" />
<property name="target" ref="userDaoTarget" />
<property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
<!-- 配置事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
第二种方式:所有Bean共享一个代理基类
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="transactionBase"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
lazy-init="true" abstract="true">
<!-- 配置事务管理器 -->
<property name="transactionManager" ref="transactionManager" />
<!-- 配置事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 配置DAO -->
<bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="userDao" parent="transactionBase" >
<property name="target" ref="userDaoTarget" />
</bean>
</beans>
第三种方式:使用拦截器
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<!-- 配置事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Dao</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<!-- 配置DAO -->
<bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
第四种方式:使用tx标签配置的拦截器
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="interceptorPointCuts"
expression="execution(* com.bluesky.spring.dao.*.*(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="interceptorPointCuts" />
</aop:config>
</beans>
第五种方式:全注
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
2使用注解@Transaction在你想要实现事务的类或者方法上面配置,并且需要在xml开启注解扫描
以上是关于spring中的事物都有哪些的主要内容,如果未能解决你的问题,请参考以下文章