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>

参考技术A 1使用bean在xml文件中配置
2使用注解@Transaction在你想要实现事务的类或者方法上面配置,并且需要在xml开启注解扫描

以上是关于spring中的事物都有哪些的主要内容,如果未能解决你的问题,请参考以下文章

spring中的核心类都有哪些,各有啥作用!

spring中的核心类都有哪些,各有啥作用!

Java中面向对象的特征都有哪些?

spring 事务实现方式都有哪些?

spring中的beanfactory与applicationcontext的作用都有哪些

Spring_事务的几种属性