-
原始的TransactionProxyFactoryBean (声明式事物管理)查看全部
-
数据库幻读查看全部
-
不可重复读查看全部
-
数据库脏读查看全部
-
总结: Spring将事务管理分成了两类: * 编程式事务管理 - 手动编写代码进行事务管理(很少使用) * 声明式事务管理 - 基于TransactionProxyFactoryBean的方式(很少使用) . 需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强 - 基于AspectJ的xml方式(经常使用) . 一旦配置好,类上不需要添加任何东西 - 基于注解(经常使用) . 配置简单,需要在业务层类上添加一个@Transactionl的注解查看全部
-
开启注解的驱动 <tx:annotation-driven/> 将事务管理器配置为可以使用注解 <!-- 开启注解事务 --> <tx:annotation-driven transaction-manager="transactionManager"/>查看全部
-
在业务类上使用一个@Transactionl的注解 @Transactionl( 这里面有属性,如果不写,就是默认的)查看全部
-
/** * @Transactionl注解中的属性(不写就全部使用默认值) * propagation : 事务传播行为 * isolation : 事务的隔离级别 */ @Transactional public class AccountServiceImpl implements AccountService { //注入转账的DAO类,使service能够调用DAO的方法 private AccountDao accountDao; public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } @Override public void transfer(String out, String in, Double money) { accountDao.outMoney(out, money); int i = 1/ 0 ; accountDao.inMoney(in, money); } } <!--配置事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 开启注解事务 --> <tx:annotation-driven transaction-manager="transactionManager"/>查看全部
-
使用aspectj配置事务管理器 <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 配置事务的通知(事务增强)--> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="transfer" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!-- 配置切面 --> <aop:config> <!-- 配置切入点 --> <aop:pointcut id="pointcut1" expression="execution(* cn.muke.spring.demo3.AccountService+.*(..))"/> <!-- 配置切面,在pointcut1切入点上应用txAdvice增强--> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/> </aop:config>查看全部
-
原始方式 - 使用xml配置声明式事务 开发中不经常使用查看全部
-
** * Spring声明式事务管理的方式一 测试类 - 传统方式 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext2.xml") public class SpringDemo2 { /** * 注入代理类 - 因为代理类进行了增强的操作 */ //@Resource(name = "accountService") @Resource(name="accountServiceProxy") private AccountService accountService; /** * 转账案例: */ @Test public void demo1() { accountService.transfer("aaa","bbb",200d); } }查看全部
-
基于TransactionProxyFactoryBean的声明式事务管理 <!-- 配置业务层的代理 --> <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!-- 配置目标对象 --> <property name="target" ref="accountService"/> <!-- 注入事务管理器 --> <property name="transactionManager" ref="transactionManager"/> <!-- 注入事务属性 --> <property name="transactionAttributes"> <props> <!-- prop的格式 PROPAGATION - 事务的传播行为 ISOLATION - 事务的隔离级别 readOnly - 只读(不可以进行修改,插入,删除的操作) -Exception - 发生哪些异常,回滚事务 +Exception - 发生哪些异常,事务不回滚 --> <prop key="transfer">PROPAGATION_REQUIRED</prop> </props> </property> </bean>查看全部
-
编程式事务管理 代码 /** * 转账案例的业务层实现类 */ public class AccountServiceImpl implements AccountService { //注入转账的DAO类,使service能够调用DAO的方法 private AccountDao accountDao; public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } //编程式事务管理 - 注入事务管理模版 private TransactionTemplate transactionTemplate; public void setTransactionTemplate(TransactionTemplate transactionTemplate) { this.transactionTemplate = transactionTemplate; } @Override public void transfer(final String out, final String in, final Double money) { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { accountDao.outMoney(out, money); //int i = 1 / 0; accountDao.inMoney(in, money); } }); } }查看全部
-
编程式事务管理 - 步骤查看全部
-
//编程式事务管理 - 注入事务管理模版 private TransactionTemplate transactionTemplate; public void setTransactionTemplate(TransactionTemplate transactionTemplate) { this.transactionTemplate = transactionTemplate; }查看全部
举报
0/150
提交
取消