spring事务控制
2017-04-07 10:34
253 查看
package dao; import java.io.Serializable; import java.util.List; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import util.Pager; import mode.User; /* * 1?关于事务默认的回滚 一. 事务碰到unchecked Exception ,默认情况下自动回滚,如果想取消自动回滚可以指定属性 @Transactional(noRollbackFor=RuntimeException.class) 二. 事务碰到checked Exception,默认情况下事务不回滚,如果想回滚可以用属性指定@Transactional(rollbackFor=Exception.class) 三. 当然事务属性中的另外一个也是可以的不过要指定的是类名noRollbackForClassName 2?事务的开启与关闭(默认情况下spring是开启事务的) @Transactional(propagation=Propagation.NOT_SUPPORTED) public List<StudentBean> getAllStudent() { return jdbcTemplate.query("select * from student", new StudentRowMapper()); } 3?@Transactional(readOnly=true) 只读事务,就是不用控制,可以提高效率 下面是事物的其它属性 4?@Transactional(timeout=1000) 事务时间 5·事务的传播属性 @Transactional(propagation=Propagation.NOT_SUPPORTED) REQUIRED: 业务方法需要在一个事务中运行。如果方法运行时,已经在一个事务中,哪么加到该事务,否则为自己创建一个新的事务。Spring默认的事务传播属性设置 @Transactional(propagation=Propagation.REQUIRED) NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。 REQUERESNEW:属性表明不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有的事务会被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行。 MANDATORY:该属性指定业务方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果业务方法在没有事务的环境下调用,容器就会抛出异常。 SUPPORTS:这一事务属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行 NEVER::指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务范围内执行,则容器抛出异常,只有业务方法没有关联到任何事务,才能正常执行。 NESTED: 如果一个事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按REQUIRED属性执行,它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionalmaManager事务管理器起效。 比如:一个get方法是不需要事务的,加上事务会影响效率的,这时我们可以加上这个属性设置:@Transactional(propagation=Propagation.NOT_SUPPORTED)。这时此方法就不会有事务控制了。 像save、update等业务方法默认都是要事务控制的 @Transactional(propagation=Propagation.REQUEIRED)---这个是默认的,可以省写 6·属性isolation—事务的隔离级别 @Transactional(isolation=Isolation.READ_UNCOMMITTED) 数据库系统提供了四种事务隔离级别(隔离级别是当数据库并行访问操作时,安全策略的实现) 数据库系统提供了四种事务隔离级别供用户选中。不同的隔离及、别采用不认同的锁类型来实现(共享锁、更新锁、排它锁),在四种隔离级别中,Serializable的隔离级别最高,Read Uncommited的隔离级别最低。大多数据库默认的隔离级别为Read Commited,如sql server,当然也有少数部分数据库默认的隔离级别为Repeatable Read,如mysql Read Uncommited:读未提交数据(会出现脏读,不可重复读和幻读) Read Commited:读已提交数据(会出现不可重复读和幻读) Repeatable Read:可重复读(会出现幻读) Serializable:串行化 脏读:一个事物读到另一个事务未提交的更新数据 不可重复读:在同一个事务中,多次读取同一数据返回的结果有所不同。换句话就是,后续读可以读到另一个事务已提交的更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能道道另一个事务已提交的更新数据 幻读:一个事务读取到另一个事务已提交的insert数据 */ @Transactional public interface UserDao { String save(User user); User getUserByNameAndPassword(String name,String password); User getUserById(Serializable id); void delete(User user); void update(User user); @Transactional(isolation=Isolation.READ_COMMITTED) List<User> list(Pager pager); }
相关文章推荐
- 谁让Spring的事务控制不起作用了
- spring 2.5整合jdbc进行数据库操作和XML事务控制
- Spring源码解析(一) Spring事务控制之Hibernate
- 第三讲 Spring 持久层封装、事务控制
- Spring事务控制
- 初探hibernate和spring集成得事务控制原理,欢迎交流。
- spring对事务的控制 AOP
- hibernate3.0+ejb3 annotaion配置实战+spring1.21 annotation事务控制
- 在Spring中使用JTA事务管理【两个数据库实现事务控制】
- Spring源码解析(一) Spring事务控制之Hibernate
- Spring 事务控制的几个文章
- Spring_事务控制
- Spring事务控制(txManager)
- Spring中的事务控制学习中
- 关于Spring.net+NHibernate的事务控制
- spring 2.5整合jdbc进行数据库操作和注解事务控制
- 基于Spring和EJB的灵活的事务控制
- spring 的事务控制 (spring + Ibatis)
- 使用spring手动控制事务
- spring-hibernate事务控制的4中方法