41、声明式事务管理的事务属性有5种:
传播行为:传播行为定义了客户端与彼调用方法之间的事务边界。
隔离级别:隔离级别定义了一个事务可能受其他并发事务影响的程度。
只读:表明事务是否是只读的。
事务超时:指定事务运行的最长时间,超时就回滚。
回滚规则:定义了哪些异常会导致事务回滚而哪些不会。
42、脏读、不可重复读和幻读
脏读:一个事务读取了另一个事务改写但是未提交的数据时。如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的。
不可重复读:一个事物执行相同的查询两次或者两次以上,但是每次都得到不同的数据。通常是因为另一个并发事务在两次查询期间更新了数据。
幻读:一个事务读取了几行数据,接着另一个并发事务插入了一些数据。在随后的查询中,第一个事务发现多了一些原本不存在的事务。
43、Spring事务的7种传播行为
PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别
它们非常 类似,都像一个嵌套事务,如果不存在一个活动的事务,都会开启一个新的事务。使用PROPAGATION_REQUIRES_NEW时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。两个事务互不影响。两个事务不是一个真正的嵌套事务。同时它需要JTA 事务管理器的支持。
使用PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。
44、Spring事务的5个隔离级别
45、spring注解说明:
采用扫描的方式 配置Spring XML 书写方式
<context:component-scanbase-package="这里是包名"/>
@Service 用于标注业务层组建
@Controller 用于标注控制层组件
@Component 泛指组件,用于不明确的类
@Repository 用户标注数据库访问组件
@PostConstruct 创建对象时执行的方法
@PreDestroy 对象摧毁时执行的方法
@Autowired 直接访问私有属性,直接给私有属性输入值。
@Resource 根据类型注入
46、Spring mvc工作原理:
1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
3.DispatcherServlet请求提交到目标Controller
4.Controller进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6.视图对象负责渲染返回给客户端。
47、Spring的优点有什么?
1. Spring是分层的架构,你可以选择使用你需要的层而不用管不需要的部分
2. Spring是POJO(Plain Ordinary Java Object),POJO编程使得可持续构建和可测试能力提高
3. 依赖注入和IoC使得JDBC操作简单化
4. Spring是开源的免费的
5. Spring使得对象管理集中化和简单化
48、spring的事务管理
spring提供了几个关于事务处理的类:
TransactionDefinition //事务属性定义
TranscationStatus //代表了当前的事务,可以提交,回滚。
PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。
49、Spring提供的事务管理
spring提供的事务管理可以分为两类:编程式实现事务,AOP配置声明式解决方案。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。
编程式实现事务,下面是其中的一种实现方式:
TransactionTemplate 的 execute() 方法有一个 TransactionCallback 类型的参数,该接口中定义了一个 doInTransaction() 方法,通常我们以匿名内部类的方式实现 TransactionCallback 接口,并在其doInTransaction() 方法中书写业务逻辑代码。这里可以使用默认的事务提交和回滚规则,这样在业务代码中就不需要显式调用任何事务管理的 API。doInTransaction()
方法有一个TransactionStatus 类型的参数,我们可以在方法的任何位置调用该参数的 setRollbackOnly() 方法将事务标识为回滚的,以执行事务回滚。
根据默认规则,如果在执行回调方法的过程中抛出了未检查异常,或者显式调用了TransacationStatus.setRollbackOnly() 方法,则回滚事务;如果事务执行完成或者抛出了 checked 类型的异常,则提交事务。
TransactionCallback 接口有一个子接口 TransactionCallbackWithoutResult,该接口中定义了一个 doInTransactionWithoutResult() 方法,TransactionCallbackWithoutResult 接口主要用于事务过程中不需要返回值的情况。当然,对于不需要返回值的情况,我们仍然可以使用TransactionCallback 接口,并在方法中返回任意值即可。
声明式事物管理,例子。
<context:component-scanbase-package="com.chou.spring.jdbc"/> <!-- 配置数据源 --> <beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <!-- Connection Info --> <property name="driverClass"value="${db.driverClass}" /> <property name="jdbcUrl"value="${db.url}" /> <property name="user"value="${db.username}" /> <property name="password"value="${db.password}" /> <!-- Connection Pooling Info --> <propertyname="initialPoolSize" value="1" /> <property name="minPoolSize"value="1" /> <property name="maxPoolSize"value="15" /> <property name="maxIdleTime"value="1800" /> <property name="maxStatements"value="0" /> </bean> <beanid="jdbcTemplateDao"class="com.chou.spring.jdbc.dao.JdbcTemplateDao" > <property name="dataSource"ref="dataSource" /> </bean> <!-- JDBC事务管理器 --> <beanid="jdbctTxManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"ref="dataSource" /> </bean> <tx:adviceid="txAdvice" transaction-manager="jdbctTxManager"> <tx:attributes> <tx:methodname="domain*"/> </tx:attributes> </tx:advice> <aop:configproxy-target-class="true"> <aop:advisoradvice-ref="txAdvice" pointcut="execution(*com.chou.spring.jdbc.service.JdbcTemplateService.*(..))"/> </aop:config>