springday03笔记.docx
- 文档编号:28614019
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:36
- 大小:546.03KB
springday03笔记.docx
《springday03笔记.docx》由会员分享,可在线阅读,更多相关《springday03笔记.docx(36页珍藏版)》请在冰豆网上搜索。
springday03笔记
1springday02回顾
●AOP:
切面编程
切面:
切入点和通知结合
●springaop编程
config> 方法1: pointcutexpression="切入点表达式"id=""> advisoradvice-ref="通知引用"pointcut-ref="切入点的引用"> 方法2: advisoradvice-ref="通知引用"pointcut="切入点表达式"> ●AspectJxml config> aspectref="切面类"> pointcut> before>前置 afterReturningreturning="第二个参数名称">后置 around>环绕 afterThrowingthrowing="第二。 。 。 ">抛出异常 after>最终 ●AspectJannotation @Aspect @Pointcut("表达式")privatevoidxxx(){} @Before@... ●切入点表达式 pointcutexpression="execution(*com.itheima.crm.*.service..*.*(..))"id=""> 2事务管理 2.1回顾事务 ●事务: 一组业务操作ABCD,要么全部成功,要么全部不成功。 ●特性: ACID 原子性: 整体 一致性: 完成 隔离性: 并发 持久性: 结果 ●隔离问题: 脏读: 一个事务读到另一个事务没有提交的数据 不可重复读: 一个事务读到另一个事务已提交的数据(update) 虚读(幻读): 一个事务读到另一个事务已提交的数据(insert) ●隔离级别: readuncommitted: 读未提交。 存在3个问题 readcommitted: 读已提交。 解决脏读,存在2个问题 repeatableread: 可重复读。 解决: 脏读、不可重复读,存在1个问题。 serializable: 串行化。 都解决,单事务。 ●mysql事务操作--简单 ABCD一个事务 Connectionconn=null; try{ //1获得连接 conn=...; //2开启事务 conn.setAutoCommit(false); A B C D //3提交事务 mit(); }catche(){ //4回滚事务 conn.rollback(); } ●mysql事务操作--Savepoint 需求: AB(必须),CD(可选) Connectionconn=null; Savepointsavepoint=null;//保存点,记录操作的当前位置,之后可以回滚到指定的位置。 (可以回滚一部分) try{ //1获得连接 conn=...; //2开启事务 conn.setAutoCommit(false); A B savepoint=conn.setSavepoint(); C D //3提交事务 mit(); }catche(){ if(savepoint! =null){//CD异常 //回滚到CD之前 conn.rollback(savepoint); //提交AB mit(); }else{//AB异常 //回滚AB conn.rollback(); } } 2.2事务管理介绍 2.2.1导入jar包 transaction-->tx 2.2.2三个顶级接口 ●PlatformTransactionManager平台事务管理器,spring要管理事务,必须使用事务管理器 进行事务配置时,必须配置事务管理器。 ●TransactionDefinition: 事务详情(事务定义、事务属性),spring用于确定事务具体详情, 例如: 隔离级别、是否只读、超时时间等 进行事务配置时,必须配置详情。 spring将配置项封装到该对象实例。 ●TransactionStatus: 事务状态,spring用于记录当前事务运行状态。 例如: 是否有保存点,事务是否完成。 spring底层根据状态进行相应操作。 2.2.3PlatformTransactionManager事务管理器 ●导入jar包: 需要时平台事务管理器的实现类 ●常见的事务管理器 DataSourceTransactionManager,jdbc开发时事务管理器,采用JdbcTemplate HibernateTransactionManager,hibernate开发时事务管理器,整合hibernate ●api详解 TransactionStatusgetTransaction(TransactionDefinitiondefinition),事务管理器通过“事务详情”,获得“事务状态”,从而管理事务。 voidcommit(TransactionStatusstatus)根据状态提交 voidrollback(TransactionStatusstatus)根据状态回滚 2.2.4TransactionStatus 2.2.5TransactionDefinition ●传播行为: 在两个业务之间如何共享事务。 PROPAGATION_REQUIRED,required,必须【默认值】 支持当前事务,A如果有事务,B将使用该事务。 如果A没有事务,B将创建一个新的事务。 PROPAGATION_SUPPORTS,supports,支持 支持当前事务,A如果有事务,B将使用该事务。 如果A没有事务,B将以非事务执行。 PROPAGATION_MANDATORY,mandatory,强制 支持当前事务,A如果有事务,B将使用该事务。 如果A没有事务,B将抛异常。 PROPAGATION_REQUIRES_NEW,requires_new,必须新的 如果A有事务,将A的事务挂起,B创建一个新的事务 如果A没有事务,B创建一个新的事务 PROPAGATION_NOT_SUPPORTED,not_supported,不支持 如果A有事务,将A的事务挂起,B将以非事务执行 如果A没有事务,B将以非事务执行 PROPAGATION_NEVER,never,从不 如果A有事务,B将抛异常 如果A没有事务,B将以非事务执行 PROPAGATION_NESTED,nested,嵌套 A和B底层采用保存点机制,形成嵌套事务。 掌握: PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED 2.3案例: 转账 2.3.1搭建环境 2.3.1.1创建表 createdatabaseee19_spring_day03; useee19_spring_day03; createtableaccount( idintprimarykeyauto_increment, usernamevarchar(50), moneyint ); insertintoaccount(username,money)values('jack','10000'); insertintoaccount(username,money)values('rose','10000'); 2.3.1.2导入jar包 ●核心: 4+1 ●aop: 4(aop联盟、springaop、aspectj规范、springaspect) ●数据库: 2(jdbc/tx) ●驱动: mysql ●连接池: c3p0 2.3.1.3dao层 publicclassAccountDaoImplextendsJdbcDaoSupportimplementsAccountDao{ @Override publicvoidout(Stringouter,Integermoney){ this.getJdbcTemplate().update("updateaccountsetmoney=money-? whereusername=? ",money,outer); } @Override publicvoidin(Stringinner,Integermoney){ this.getJdbcTemplate().update("updateaccountsetmoney=money+? whereusername=? ",money,inner); } } 2.3.1.4service层 publicclassAccountServiceImplimplementsAccountService{ privateAccountDaoaccountDao; publicvoidsetAccountDao(AccountDaoaccountDao){ this.accountDao=accountDao; } @Override publicvoidtransfer(Stringouter,Stringinner,Integermoney){ accountDao.out(outer,money); //断电 //inti=1/0; accountDao.in(inner,money); } } 2.3.1.5spring配置 --1datasource--> mysql: //localhost: 3306/ee19_spring_day03"> --2dao--> --3service--> 2.3.1.6测试 @Test publicvoiddemo01(){ StringxmlPath="applicationContext.xml"; ApplicationContextapplicationContext=newClassPathXmlApplicationContext(xmlPath); AccountServiceaccountService=(AccountService)applicationContext.getBean("accountService"); accountService.transfer("jack","rose",1000); } 2.3.2手动管理事务(了解) ●spring底层使用TransactionTemplate事务模板进行操作。 ●操作 1.service需要获得TransactionTemplate 2.spring配置模板,并注入给service 3.模板需要注入事务管理器 4.配置事务管理器: DataSourceTransactionManager,需要注入DataSource 2.3.2.1修改service //需要spring注入模板 privateTransactionTemplatetransactionTemplate; publicvoidsetTransactionTemplate(TransactionTemplatetransactionTemplate){ this.transactionTemplate=transactionTemplate; } @Override publicvoidtransfer(finalStringouter,finalStringinner,finalIntegermoney){ transactionTemplate.execute(newTransactionCallbackWithoutResult(){ @Override protectedvoiddoInTransactionWithoutResult(TransactionStatusarg0){ accountDao.out(outer,money); //断电 //inti=1/0; accountDao.in(inner,money); } }); } 2.3.2.2修改spring配置 --3service--> --4创建模板--> --5配置事务管理器,管理器需要事务,事务从Connection获得,连接从连接池DataSource获得--> 2.3.3工厂bean生成代理: 半自动 ●spring提供管理事务的代理工厂beanTransactionProxyFactoryBean 1.getBean()获得代理对象 2.spring配置一个代理 2.3.3.1spring配置 --4service代理对象 4.1proxyInterfaces接口 4.2target目标类 4.3transactionManager事务管理器 4.4transactionAttributes事务属性(事务详情) prop.key: 确定哪些方法使用当前事务配置 prop.text: 用于配置事务详情 格式: PROPAGATION,ISOLATION,readOnly,-Exception,+Exception 传播行为隔离级别是否只读异常回滚异常提交 例如: --> --5事务管理器--> 2.3.3.2测试 2.3.4AOP配置基于xml【掌握】 ●在springxml配置aop自动生成代理,进行事务的管理 1.配置管理器 2.配置事务详情 3.配置aop --4事务管理--> --4.1事务管理器--> --4.2事务详情(事务通知),在aop筛选基础上,对ABC三个确定使用什么样的事务。 例如: AC读写、B只读等 attributes>用于配置事务详情(属性属性) methodname=""/>详情具体配置 propagation传播行为,REQUIRED: 必须;REQUIRES_NEW: 必须是新的 isolation隔离级别 --> adviceid="txAdvice"transaction-manager="txManager"> attributes> methodname="transfer"propagation="REQUIRED"isolation="DEFAULT"/> attributes> advice> --4.3AOP编程,目标类有ABCD(4个连接点),切入点表达式确定增强的连接器,从而获得切入点: ABC--> config> advisoradvice-ref="txAdvice"pointcut="execution(*com.itheima.service..*.*(..))"/> config> 2.3.5AOP配置基于注解【掌握】 ●1.配置事务管理器,将并事务管理器交予spring ●2.在目标类或目标方法添加注解即可@Transactional 2.3.5.1spring配置 --4事务管理--> --4.1事务管理器--> --4.2将管理器交予spring *transaction-manager配置事务管理器 *proxy-target-class true: 底层强制使用cglib代理 --> annotation-driventransaction-manager="txManager"/> 2.3.5.2service层 @Transactional publicclassAccountServiceImplimplementsAccountService{ 2.3.5.3事务详情配置 @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT) publicclassAccountServiceImplimpleme
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- springday03 笔记