Spring测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:xxx.xml")
@Resource(name="")
Spring事务:逻辑上的一组操作,要么全部成功,要么全部失败
Spring事务管理的一组API
Spring的编程式事务管理(事务管理模板)
1.在实际运用中很少使用
2.通过TrasactionTemplate手动管理事务
1.在AccountService中使用TransactionTemplate
2.TransactionTemplate依赖DataSourceTransactionManager
3.DataSourceTransactionManager依赖DataSource构造
(事务管理器有了连接池才能获得链接进行事务管理)
Spring的声明式事务管理(重点)
1.开发中推荐使用(代码入侵性最小)
2.Spring的声明式事务是(通过AOP实现的)
第一种:基于代理TransactionProxyFactoryBean;(很少使用)
需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强
注入:目标,事务管理器,事务属性:
1.PROPAGATION :事务的传播行为
2.ISOLATION :事务的隔离级别
3.readOnly :只读,(不可以进行修改,插入,删除)
4.-Exception :发生那些异常回滚事务
5.+Exception :发生那些异常事务不回滚
第二种:基于AspectJ的XML方式(aspectJ的话,就是分的更加的详细,切入点(类),切入面(方法))
1.配置事务的通知<tx>
2.配置切面,切点<aop>
第三种:基于注解的方式
1.开启事务<tx:annotation-driven transaction-Manager="" />
2.service类@Transactional(name=value)
事务的特性:
原子性,不可分割,要么失败,要么成功
一致性,前后数据完整性必须保持一致
隔离性,事务之间相互不影响
持久性,一个事务一旦提交,对数据库的数据改变是永久性。(数据库发生改变也不影响)
Spring事务管理高层抽象主要包括3个接口:
1.PlaformTransactionManager 事务管理器
2.TransactionDefinition 事务定义信息(隔离,传播,超时,只读)
3.TransactionStatus 事务具体运行状态
1.PlaformTransactionManager接口,根据不同的持久层的框架有不同的实现类
2.TransactionDefinition接口,提供了一组常量和方法
隔离级别:解决(脏读,不可重复读,幻读)
->脏读:a事务修改了数据,但是还未提交,b事务读到了这个数据,
但是如果回滚了,b事务读的的数据就是无效的
->不可重复读:限制在一个事务里,多次读到的数据,竟然有不同
->幻读:a事务读了几行数据,b事务insert了几条数据,
导致a事务第二次执行的时候,数据竟然和第一次读到的数据,
不一致(两次查询不一致)
传播行为:解决业务层方法之间的相互调用的问题(7种分3类)
1.PROPAGATION_REQUIRED 支持当前事务,如果不存在就新建一个(主)
2.PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
3.PROPAGATION_MANDATORY 支持当前食物,如果不存在,抛出异常
1.PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新事物(主)
2.PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事物,挂起当前事物
3.PROPAGATION_NEVER 以非事物方式运行,如果有事务存在,抛出异常
1.PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行(主)(
回滚到保存点,如果a发生异常,那么保存事务点,b回滚的时候回滚到保存点或者事务的开始)
3.TransactionStatus 获取或判断事务的状态
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:xxx.xml")
@Resource(name="")
Spring事务:逻辑上的一组操作,要么全部成功,要么全部失败
Spring事务管理的一组API
Spring的编程式事务管理(事务管理模板)
1.在实际运用中很少使用
2.通过TrasactionTemplate手动管理事务
1.在AccountService中使用TransactionTemplate
2.TransactionTemplate依赖DataSourceTransactionManager
3.DataSourceTransactionManager依赖DataSource构造
(事务管理器有了连接池才能获得链接进行事务管理)
Spring的声明式事务管理(重点)
1.开发中推荐使用(代码入侵性最小)
2.Spring的声明式事务是(通过AOP实现的)
第一种:基于代理TransactionProxyFactoryBean;(很少使用)
需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强
注入:目标,事务管理器,事务属性:
1.PROPAGATION :事务的传播行为
2.ISOLATION :事务的隔离级别
3.readOnly :只读,(不可以进行修改,插入,删除)
4.-Exception :发生那些异常回滚事务
5.+Exception :发生那些异常事务不回滚
第二种:基于AspectJ的XML方式(aspectJ的话,就是分的更加的详细,切入点(类),切入面(方法))
1.配置事务的通知<tx>
2.配置切面,切点<aop>
第三种:基于注解的方式
1.开启事务<tx:annotation-driven transaction-Manager="" />
2.service类@Transactional(name=value)
事务的特性:
原子性,不可分割,要么失败,要么成功
一致性,前后数据完整性必须保持一致
隔离性,事务之间相互不影响
持久性,一个事务一旦提交,对数据库的数据改变是永久性。(数据库发生改变也不影响)
Spring事务管理高层抽象主要包括3个接口:
1.PlaformTransactionManager 事务管理器
2.TransactionDefinition 事务定义信息(隔离,传播,超时,只读)
3.TransactionStatus 事务具体运行状态
1.PlaformTransactionManager接口,根据不同的持久层的框架有不同的实现类
2.TransactionDefinition接口,提供了一组常量和方法
隔离级别:解决(脏读,不可重复读,幻读)
->脏读:a事务修改了数据,但是还未提交,b事务读到了这个数据,
但是如果回滚了,b事务读的的数据就是无效的
->不可重复读:限制在一个事务里,多次读到的数据,竟然有不同
->幻读:a事务读了几行数据,b事务insert了几条数据,
导致a事务第二次执行的时候,数据竟然和第一次读到的数据,
不一致(两次查询不一致)
传播行为:解决业务层方法之间的相互调用的问题(7种分3类)
1.PROPAGATION_REQUIRED 支持当前事务,如果不存在就新建一个(主)
2.PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
3.PROPAGATION_MANDATORY 支持当前食物,如果不存在,抛出异常
1.PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新事物(主)
2.PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事物,挂起当前事物
3.PROPAGATION_NEVER 以非事物方式运行,如果有事务存在,抛出异常
1.PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行(主)(
回滚到保存点,如果a发生异常,那么保存事务点,b回滚的时候回滚到保存点或者事务的开始)
3.TransactionStatus 获取或判断事务的状态