@Transactional spring事务

问题描述

业务bean:@Transactionalpublic class PersonServiceBean implements PersonService {@Resource private SessionFactory sessionFactory;public void save(Person person){sessionFactory.getCurrentSession().persist(person); session,persist()}public void update(Person person){sessionFactory.getCurrentSession().merge(person);}@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)public Person getPerson(Integer personId){return (Person)sessionFactory.getCurrentSession().get(Person.class, personId);}public void delete(Integer personId){sessionFactory.getCurrentSession().delete(sessionFactory.getCurrentSession().load(Person.class, personId));}}spring配置文件:<aop:aspectj-autoproxy /> <context:property-placeholder location="classpath:jdbc.properties"/> <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${driveClassName}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> <property name="initialSize" value="${initialSize}"/> <property name="maxActive" value="${maxActive}"/> <property name="maxIdle" value="${maxIdle}"/> <property name="minIdle" value="${minIdle}"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="myDataSource"/> <property name="mappingResources"> <list> <value>com/tank/bean/Person.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">false</prop> <prop key="hibernate.cache.use_second_level_cache">true</prop><prop key="hibernate.cache.use_query_cache">false</prop><prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> </props> </property> </bean> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <tx:annotation-driven transaction-manager="txManager"/><aop:config><aop:pointcut id="myPointCut" expression="execution(* com.tank.service..*.*(..))" /><aop:advisor pointcut-ref="myPointCut" advice-ref="txAdvice"/></aop:config><tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="delete*" /> <tx:method name="save*" read-only="true"/> <tx:method name="update*" /> <tx:method name="*" propagation="SUPPORTS"/> </tx:attributes></tx:advice> <bean id="personService" class="com.tank.service.impl.PersonServiceBean"/> <bean id="personList" class="com.tank.web.PersonAction.PersonAction"/>问题: <tx:method name="save*" read-only="true"/> 这个方法已经为只读,但仍能保存进数据库业务bean已经被@Transactional了。 如果我在save()方法上在注明@Transactional(propagation=Propagation.SUPPORTES)的话,可以生效!!什么原因?貌似管理也有啊!!!

解决方案

大哥,你又用@Transactional注解事物,又用aop的expression正则配置方法事务。两者已经冲突了。 @Transactional在类当中配置全局事务,已经覆盖了你xml文件配置的声明式事物。去掉类当中的@Transactional就ok了。
解决方案二:
<tx:annotation-driven transaction-manager="txManager"/> 就不需要<tx:method name="save*" read-only="true"/> 这个了! 所以引用<tx:method name="save*" read-only="true"/> 这个方法已经为只读,但仍能保存进数据库 业务bean已经被@Transactional了。 如果我在save()方法上在注明@Transactional(propagation=Propagation.SUPPORTES)的话,可以生效!! 什么原因?貌似管理也有啊!!!
解决方案三:
bean只被@Transactional标注而已,并没有指定propagation,实际上在执行save方法是并没有开启事务,所以readonly没起作用,仍然可以保存。

时间: 2024-09-14 12:00:19

@Transactional spring事务的相关文章

spring事务注解@Transactional事务不回滚

问题描述 spring事务注解@Transactional事务不回滚 如题: public interface A { public void A(); } public class B implements A{ public void A(){ B();} @Transactional public void B(){ //删除数据 //两者之前发生异常了... //添加数据 } } 如果将@Transactional注解放在某一service实现类的某一非入口方法,发现数据不会回滚,请问大

浅析spring事务传播级别

spring是一个开源的框架,Spring为简化企业级应用开发而生,使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能.今天我们先避开spring核心IOC&AOP,浅谈一下spring的事务传播级别. 误区 spring由于事务是是通过service一层控制的,因此为了保证事务的安全和可控性,尽量不要将两个事务要求的方法进行相互调用. 想想看,spring身为一个伟大的,灵活的框架.它怎么可能在事务这么重要的功能上给我们挖坑呢 在最开始使用spring进行事务开发管理

Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别

spring事务配置的五种方式: 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部

Spring事务配置的五种方式(转自robbie的博客)

 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的.     总结如下:     Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分.     DataSource.TransactionManager这两部分只是会

spring 事务回滚问题

问题描述 我有2个DAO分别是IndepotOrderDao和InDepotRecordDao都继承JdbcDaoSupportpublicclassIndepotOrderDaoImplextendsJdbcDaoSupport{saveInDepotOrder(IndepotOrderindepotOrder){sql="insertintoindepotOrder(name)value(?)";Object[]args={"orderName"};this.g

spring事务管理的一些注意点

总结一些自己最近在使用spring事务管理时碰到的一些注意点   一.关于目标对象内部方法自我调用时的一些情形和存在的问题 1.情形1:只给b方法上加事务注解,a方法上不加 目标类的接口和实现代码示例: public interface AService {     public void a();     public void b(); }   @Service() public class AServiceImpl implements AService{     public void

Spring事务配置的五种方式 巨全!不看后悔,一看必懂!

前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的.     总结如下:     Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分.     DataSource.TransactionManager这两部分只是会根

Spring事务讲解示例(转)

  Spring 事务Transaction1.事务的属性1.1 事务隔离IsolationLevel1.2 事务传播PropagationBehavior1.3 事务超时Timeout1.4 只读状态ReadOnly隔离级别.超时.只读状态都依赖于底层的数据库实现,Spring仅仅起了代理作用(MySQL的MyISAM引擎是无事务引擎,那么Spring是不可能带有事务管理功能的).事务传播行为是Spring框架所特有的.2 使用Spring事务只需要了解PlatformTransactionM

spring 事务方法的调用与事务是否失效

问题描述 spring 事务方法的调用与事务是否失效 在项目中采用注解的方式配置事务 public class UserServiceImple{ @Transactional(rollbackFor=Exception.class) public string a(User user){ //执行修改用户基本信息操作: userDao.update(user); this.b(user); return null; } private void b(User user) throws Exce