当前位置: 首页 > news >正文

网站如何从后台进入天津住房与城乡建设部网站

网站如何从后台进入,天津住房与城乡建设部网站,短网址生成防屏蔽,打开百度地图导航什么是事务 保证业务操作完整性的一种数据库机制 #xff08;driver 驱动#xff09;事务特定 ACID A 原子性 #xff08;多次操作 要不一起成功 要不一起失败 #xff08;部分失败 savepoint#xff09;#xff09; C 一致性 #xff08;事务开始时数据状态#xff0c… 什么是事务 保证业务操作完整性的一种数据库机制 driver 驱动事务特定 ACID A 原子性 多次操作 要不一起成功 要不一起失败 部分失败 savepoint C 一致性 事务开始时数据状态事务结束是数据状态 一致 I 隔离性 (多个事务不能互相影响做到隔离) D 持久性 事务操作的结果 永久持久化在数据库事务 单机版本 和 分布式版本事务spring控制事务 核心要点通过AOP方式创建事务。 方式编程式事务、声明式事务 一个事务的demo Configuration ComponentScan(com.qxlx.tx.annotation) EnableTransactionManagement public class AppConfig {Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource) {JdbcTemplate jdbcTemplate new JdbcTemplate();jdbcTemplate.setDataSource(dataSource);return jdbcTemplate;}Beanpublic DataSource dataSource() {DruidDataSource dataSource new DruidDataSource();dataSource.setUsername(root);dataSource.setPassword(rootroot);dataSource.setDriverClassName(com.mysql.jdbc.Driver);dataSource.setUrl(jdbc:mysql://localhost:3306/test);return dataSource;}Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}}Service public class UserServiceImpl implements UserService {Autowiredprivate UserDao userDao;OverrideTransactionalpublic void register(User user) {userDao.save(user);}}Repository public class UserDaoImpl implements UserDao {Autowiredprivate JdbcTemplate jdbcTemplate;Overridepublic void save(User user) {jdbcTemplate.update(insert into user(name,age) values (?,?),user.getName(),user.getAge());} }测试类 AnnotationConfigApplicationContext ioc new AnnotationConfigApplicationContext(AppConfig.class);UserService userService (UserService) ioc.getBean(userServiceImpl);User user new User();user.setName(Qxlx);user.setAge(27);userService.register(user);我们来思考有哪些核心流程其实对应AOP来说1 前置处理类以及生成代理类的过程 2.在生成代理类之后通过代理类对象执行最终方法的调用的拦截处理。 其实事务也是基于AOP进行完成功能的所以整体也是这两个部分。 事务基础 事务属性的目的为了更好的描述 事务的特点 隔离级别 ## 传播属性 ## 只读、超时、异常 前置类的初始化 在AppConfig类 引入了一个注解 EnableTransactionManagement我们知道一半Enable注解都是通过Import的方式引入外部类 然后去完成对应的功能。 Import(TransactionManagementConfigurationSelector.class) public interface EnableTransactionManagement {boolean proxyTargetClass() default false;AdviceMode mode() default AdviceMode.PROXY;int order() default Ordered.LOWEST_PRECEDENCE; }所以实际上是引入了两个类。 public class TransactionManagementConfigurationSelector extends AdviceModeImportSelectorEnableTransactionManagement {protected String[] selectImports(AdviceMode adviceMode) {switch (adviceMode) {case PROXY:return new String[] {AutoProxyRegistrar.class.getName(),ProxyTransactionManagementConfiguration.class.getName()};}AutoProxyRegistrar 查看类结果图发现其实本质就是BPP的实现类 所以总结一下通过enable注解 注册一个BPP然后BPP实例化之后在实例化自定义bean的时候去生成代理类。剩下的代码就不过看了。 ProxyTransactionManagementConfiguration 这个TransactionInterceptor 拦截器很关键在运行具体方法的时候使用的。 运行时的核心流程 userService.register(user);return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this); return invokeWithinTransaction(invocation.getMethod(), targetClass, invocation::proceed);开启事务-createTransactionIfNecessary getTransaction 获取事务的状态同时开启事务 public final TransactionStatus getTransaction(Nullable TransactionDefinition definition) throws TransactionException {// new一个 DataSourceTransactionObject对象// 同时从threadLocal中获取Connect datasource为key // 第一次为空Object transaction doGetTransaction();// 是否存在事务if (isExistingTransaction(transaction)) {// Existing transaction found - check propagation behavior to find out how to behave.return handleExistingTransaction(definition, transaction, debugEnabled);}if (definition.getPropagationBehavior() TransactionDefinition.PROPAGATION_REQUIRED ||definition.getPropagationBehavior() TransactionDefinition.PROPAGATION_REQUIRES_NEW ||definition.getPropagationBehavior() TransactionDefinition.PROPAGATION_NESTED) {SuspendedResourcesHolder suspendedResources suspend(null);try {boolean newSynchronization (getTransactionSynchronization() ! SYNCHRONIZATION_NEVER);DefaultTransactionStatus status newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, suspendedResources);// 开启事务 doBegin(transaction, definition);prepareSynchronization(status, definition);return status;}}protected void doBegin(Object transaction, TransactionDefinition definition) {DataSourceTransactionObject txObject (DataSourceTransactionObject) transaction;Connection con null;try {if (!txObject.hasConnectionHolder() ||txObject.getConnectionHolder().isSynchronizedWithTransaction()) {Connection newCon obtainDataSource().getConnection();txObject.setConnectionHolder(new ConnectionHolder(newCon), true);}txObject.getConnectionHolder().setSynchronizedWithTransaction(true);con txObject.getConnectionHolder().getConnection();Integer previousIsolationLevel DataSourceUtils.prepareConnectionForTransaction(con, definition);txObject.setPreviousIsolationLevel(previousIsolationLevel);// Switch to manual commit if necessary. This is very expensive in some JDBC drivers,// so we dont want to do it unnecessarily (for example if weve explicitly// configured the connection pool to set it already).if (con.getAutoCommit()) {txObject.setMustRestoreAutoCommit(true);con.setAutoCommit(false);}prepareTransactionalConnection(con, definition);txObject.getConnectionHolder().setTransactionActive(true);int timeout determineTimeout(definition);if (timeout ! TransactionDefinition.TIMEOUT_DEFAULT) {txObject.getConnectionHolder().setTimeoutInSeconds(timeout);}// Bind the connection holder to the thread.// 绑定连接到ThreadLocal中 if (txObject.isNewConnectionHolder()) {TransactionSynchronizationManager.bindResource(obtainDataSource(), txObject.getConnectionHolder());}}prepareTransactionInfo 进行TransactionInfo封装 1.封装TransactionInfo对象 将新的transactionInfo存储起来到ThreadLocal。 清除事务信息 cleanupTransactionInfo 将外部事务进行恢复 事务提交 commitTransactionAfterReturning txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());事务回滚 completeTransactionAfterThrowing 原始方法 抛出异常一定回滚吗 Exception及其子类 默认提交 RuntimeException及其子类 或者Error错误 protected void completeTransactionAfterThrowing(Nullable TransactionInfo txInfo, Throwable ex) {if (txInfo ! null txInfo.getTransactionStatus() ! null) {if (txInfo.transactionAttribute ! null txInfo.transactionAttribute.rollbackOn(ex)) {txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus()); }else {// We dont roll back on this exception.// Will still roll back if TransactionStatus.isRollbackOnly() is true.txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());}}}可以发现默认抛出的异常时 RuntimeException 子类才会进行事务的回滚或者是Error的类型。 public boolean rollbackOn(Throwable ex) {return (ex instanceof RuntimeException || ex instanceof Error);}那么到这里就结束了吗其实上面罗列的只是一个简单的流程。我们知道Spring有几大特性其中最为复杂的传播属性是Spring特有的机制那么他是如何完整多个事务嵌套的场景执行的呢 传播机制原理核心原理 其实大概的流程 如果用伪代码来描述的话大概如下假设我们执行的流程是这样。 addUser() ; 传播属性为REQUIRED addBlack() ; 默认传播属性 REQUIRED_NEW 1.先执行外部addUser(); 创建连接-反射执行目标方法addUser()-接着执行addBlack()- (1.挂起addUser事务 2.创建新事务 3.执行addBlack()- 提交事务 4.恢复addUser事务)- addBlack 提交事务 完成其实问题的核心点我们需要找到挂起事务的流程 以及恢复事务的流程 看看代码是如何实现的基本上了解spring底层是如何完成这个处理的。 总结 spring事务整体的核心流程 其实就是在AOP是在IOC基础上动态创建代理对象事务在IOCAOP的基础上 创建事务代理对象完成一系列的功能。源码内容本身是比较复杂和关系比较错乱如果想每行源码都搞清楚那么不太现实所以核心就是抓主干逻辑梳理清楚核心关键点在看细节。
http://www.hkea.cn/news/14457293/

相关文章:

  • 宁波外贸网站制作申请建设网站的报告
  • 万网续费登录网站做网站被罚款
  • 响应式潍坊网站建设怎么做网页?
  • 海南海口网站建设seo工作是什么意思
  • 电子商务网站建设合同银川市住房和城乡建设厅网站
  • 搭建本地环境做网站找网络公司做网站需要注意什么
  • 网站双语版的怎么制作如何禁止通过ip访问网站
  • 大连辰熙大厦做网站房地产平面设计网站
  • 国内出名的校园文化建设网站有哪些手机在线销售网站 - 百度
  • 西安网站建设 招聘杭州seo 云优化科技
  • 小程序定制开发流程郑州网站优化渠道
  • 廊坊 网站重庆做网站有哪些
  • 四川法制建设网站拼多多关键词优化是怎么弄的
  • 安陆网站的建设软件系统开发要多少钱
  • 阿里云网站建设方案书填写昆明网站建设php
  • 做网站需要学哪些软件wordpress底部主题
  • 安徽网站开发推荐wordpress历史版本下载地址
  • 什么是网站链接优化模板做的网站 怎么提升排名
  • 洛阳400电话洛阳网站seo公司装修费用怎么做账
  • 网站关键词提交凡科网站开发
  • 入侵织梦网站公司简介模板免费文字版
  • 自建网站餐饮服务提供者免费seo快速排名系统
  • 建设银行信用卡积分兑换商城网站ui设计需要学历吗
  • 开发app找什么公司seo排名技巧
  • 怎么在网上卖东西给外国人台州做优化
  • 西宁网站建设哪家强如何设计旅游网站
  • 网站做关键词库的作用广州环保网站建设
  • phpnow 新建网站莆田高端模板建站
  • 诸城网站建设公司排名图片制作器app
  • 成都便宜网站建设公司哪家好专业的企业网站建设