当前位置: 首页 > news >正文 酒吧网站建设报价模板余杭区建设规划局网站 news 2025/10/22 1:50:39 酒吧网站建设报价模板,余杭区建设规划局网站,重庆最大的本地交流网站,一个服务器做多个网站一、为什么需要事务#xff1f; 事务定义 将一组操作封装成一个执行单元#xff08;封装到一起#xff09;#xff0c;要么全部成功#xff0c;要么全部失败。 为什么要用事务#xff1f; 比如转账分为两个操作#xff1a; 第一步操作#xff1a; A 账户 -100 元…一、为什么需要事务 事务定义 将一组操作封装成一个执行单元封装到一起要么全部成功要么全部失败。 为什么要用事务 比如转账分为两个操作 第一步操作 A 账户 -100 元。 第二步操作 B 账户 100 元。 如果没有事务第一步执行成功了第二步执行失败了那么 A 账户平白无故的 100 元就 “ 人间蒸发 ” 了。而如果使用事务就可以解决这个问题让这一组操作要么一起成功要么一起失败。 二、Spring 中事务的实现 Spring 中的事务操作分为两类 1. 手动操作事务。 2. 声明式自动提交事务。 在开始讲解它们之前咱们先来回顾事务在 MySQL 中是如何使用的 2.1 MySQL 中的事务使用回顾 事务在 MySQL 有 3 个重要的操作开启事务、提交事务、回滚事务它们对应的操作命令如下 -- 开启事务 start transaction; -- 业务执行 -- 提交事务 commit; -- 回滚事务 rollback; 2.2 Spring 手动操作事务 Spring 手动操作事务和上面 MySQL 操作事务类似它也是有 3 个重要操作步骤 开启事务获取事务。 提交事务。 回滚事务。 SpringBoot 内置了两个对象 DataSourceTransactionManager 用来获取事务开启事务、提交或回滚事务的而 TransactionDefinition 是事务的属性在获取事务的时候需要将 TransactionDefinition 传递进去从而获得一个事务 TransactionStatus 实现代码如下 RestController public class UserController { Resource private UserService userService; // JDBC 事务管理器 Resource private DataSourceTransactionManager dataSourceTransactionManager; // 定义事务属性 Resource private TransactionDefinition transactionDefinition; RequestMapping(/sava) public Object save(User user) { // 开启事务 TransactionStatus transactionStatus dataSourceTransactionManager .getTransaction(transactionDefinition); // 插入数据库 int result userService.save(user); // 提交事务 dataSourceTransactionManager.commit(transactionStatus); // // 回滚事务 // dataSourceTransactionManager.rollback(transactionStatus); return result; } } 从上述代码可以看出以上代码虽然可以实现事务但操作也很繁琐有没有更简单的实现方法呢请看下面声明式事务。 2.3 Spring 声明式事务自动事务 声明式事务的实现很简单只需要在需要的方法上添加 Transactional 注解就可以实现了 无需手动 开启事务和提交事务进入方法时自动开启事务方法执行完会自动提交事务如果中途发生了没有处 理的异常会自动回滚事务 具体实现代码如下 RequestMapping(/save) Transactional public Object save(User user) { int result userService.save(user); return result; } 接下里使用以下代码分别设置 Transactional 注解和不设置 Transactional 观察它们的执行区别 2.3.1 Transactional 作用范围 Transactional 可以用来修饰方法或类 修饰方法时需要注意 只能应用到 public 方法上否则不生效 。推荐此种用法。 修饰类时表明该注解对该类中所有的 public 方法都生效。 2.3.2 Transactional 参数说明 2.3.3 注意事项 Transactional 在异常被捕获的情况下不会进行事务自动回滚验证以下代码是否会发生事务回滚 RestController public class UserController { Resource private UserService userService; RequestMapping(/save) Transactional public Object save(User user) { // 插入数据库 int result userService.save(user); try { // 执行了异常代码(0不能做除数) int i 10 / 0; } catch (Exception e) { System.out.println(e.getMessage()); } return result; } } 事务不会自动回滚解决方案 解决方案 1 对于捕获的异常事务是会自动回滚的因此解决方案 1 就是可以将异常重新抛出具体实现如下 RequestMapping(/save) Transactional(isolation Isolation.SERIALIZABLE) public Object save(User user) { // 插入数据库 int result userService.save(user); try { // 执行了异常代码(0不能做除数) int i 10 / 0; } catch (Exception e) { System.out.println(e.getMessage()); // 将异常重新抛出去 throw e; } return result; } 解决方案 2 手动回滚事务在方法中使用 TransactionAspectSupport.currentTransactionStatus() 可以得到当前的事务然后设置回滚方法 setRollbackOnly 就可以实现回滚了具体实现代码如下 RequestMapping(/save) Transactional(isolation Isolation.SERIALIZABLE) public Object save(User user) { // 插入数据库 int result userService.save(user); try { // 执行了异常代码(0不能做除数) int i 10 / 0; } catch (Exception e) { System.out.println(e.getMessage()); // 手动回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } return result; } 2.3.4 Transactional 工作原理 Transactional 是基于 AOP 实现的 AOP 又是使用动态代理实现的。如果目标对象实现了接口默认情况下会采用 JDK 的动态代理如果目标对象没有实现了接口 , 会使用 CGLIB 动态代理。 Transactional 在开始执行业务之前通过代理先开启事务在执行成功之后再提交事务。如果中途遇到的异常则回滚事务。 Transactional 实现思路预览 Transactional 具体执行细节如下图所示 三、事务隔离级别 3.1 事务特性回顾 事务有 4 大特性 ACID 原子性、持久性、一致性和隔离性具体概念如下 原子性一个事务transaction中的所有操作要么全部完成要么全部不完成不会结束在中间某个环节。事务在执行过程中发生错误会被回滚Rollback到事务开始前的状态就像这个事务从来没有执行过一样。 一致性在事务开始之前和事务结束以后数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 持久性事务处理结束后对数据的修改就是永久的即便系统故障也不会丢失。 隔离性数据库允许多个并发事务同时对其数据进行读写和修改的能力隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别包括读未提交Read uncommitted、读提交read committed、可重复读repeatable read和串行化 Serializable。 上面 4 个属性可以简称为 ACID 。 原子性Atomicity或称不可分割性 一致性Consistency 隔离性Isolation又称独立性 持久性Durability。 而这 4 种特性中 只有隔离性隔离级别是可以设置的。 为什么要设置事务的隔离级别 设置事务的隔离级别是用来保障多个并发事务执行更可控更符合操作者预期的。 什么是可控呢 比如近几年比较严重的新冠病毒我们会把直接接触到确证病例的人员隔离到酒店而把间接接触者 和直接接触着但未确诊的人隔离在自己的家中也就是针对不同的人群采取不同的隔离级别这种隔离方式就和事务的隔离级别类似都是采取某种行动让某个事件变的“ 更可控 ” 。而 事务的隔离级别 就是为了防止其他的事务影响当前事务执行的一种策略 。 3.2 Spring 中设置事务隔离级别 Spring 中事务隔离级别可以通过 Transactional 中的 isolation 属性进行设置具体操作如下图所示 3.2.1 MySQL 事务隔离级别有 4 种 1. READ UNCOMMITTED 读未提交也叫未提交读该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据而未提交的数据可能会发生回滚因此我们把该级别读取到的数据称之为脏数据把这个问题称之为脏读。 2. READ COMMITTED 读已提交也叫提交读该隔离级别的事务能读取到已经提交事务的数据因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果所以在不同时间的相同 SQL 查询中可能会得到不同的结果这种现象叫做不可重复读。 3. REPEATABLE READ 可重复读是 MySQL 的默认事务隔离级别 它能确保同一事务多次查询的结果一致。但也会有新的问题比如此级别的事务正在执行时另一个事务成功的插入了某条数据但因为它每次查询的结果都是一样的所以会导致查询不到这条数据自己重复插入时又失败 因为唯一约束的原因。明明在事务中查询不到这条信息但自己就是插入不进去这就叫幻读Phantom Read 。 4. SERIALIZABLE 序列化事务最高隔离级别它会强制事务排序使之不会发生冲突从而解决了脏读、不可重复读和幻读问题但因为执行效率低所以真正使用的场景并不多。 脏读一个事务读取到了另一个事务修改的数据之后后一个事务又进行了回滚操作从而 导致第一个事务读取的数据是错误的。 不可重复读一个事务两次查询得到的结果不同因为在两次查询中间有另一个事务把数 据修改了。 幻读一个事务两次查询中得到的结果集不同因为在两次查询中另一个事务有新增了一部 分数据。 在数据库中通过以下 SQL 查询全局事务隔离级别和当前连接的事务隔离级别 select global.tx_isolation,tx_isolation; 以上 SQL 的执行结果如下 3.2.2 Spring 事务隔离级别有 5 种 而 Spring 中事务隔离级别包含以下 5 种 1. Isolation.DEFAULT 以连接的数据库的事务隔离级别为主。 2. Isolation.READ_UNCOMMITTED 读未提交可以读取到未提交的事务存在脏读。 3. Isolation.READ_COMMITTED 读已提交只能读取到已经提交的事务解决了脏读存在不可重复读。 4. Isolation.REPEATABLE_READ 可重复读解决了不可重复读但存在幻读 MySQL 默认级别。 5. Isolation.SERIALIZABLE 串行化可以解决所有并发问题但性能太低。 从上述介绍可以看出相比于 MySQL 的事务隔离级别 Spring 的事务隔离级别只是多了一个 Isolation.DEFAULT 以数据库的全局事务隔离级别为主。 Spring 中事务隔离级别只需要设置 Transactional 里的 isolation 属性即可具体实现代码如下 RequestMapping(/save) Transactional(isolation Isolation.SERIALIZABLE) public Object save(User user) { // 业务实现 } 四、Spring 事务传播机制 4.1 事务传播机制是什么 Spring 事务传播机制定义了多个包含了事务的方法相互调用时事务是如何在这些方法间进行传递的。 4.2 为什么需要事务传播机制 事务隔离级别是保证多个并发事务执行的可控性的稳定性的而 事务传播机制是保证一个事务在多 个调用方法间的可控性的稳定性的 。 例子像新冠病毒一样它有不同的隔离方式酒店隔离还是居家隔离是为了保证疫情可控 然而在每个人的隔离过程中会有很多个执行的环节比如酒店隔离需要负责人员运送、物品运 送、消杀原生活区域、定时核算检查和定时送餐等很多环节而事务传播机制就是保证一个事务在 传递过程中是可靠性的回到本身案例中就是保证每个人在隔离的过程中可控的。 事务隔离级别解决的是多个事务同时调用一个数据库的问题如下图所示 而事务传播机制解决的是一个事务在多个节点方法中传递的问题如下图所示 4.3 事务传播机制有哪些 Spring 事务传播机制包含以下 7 种 1. Propagation.REQUIRED 默认的事务传播级别它表示如果当前存在事务则加入该事务如果当前没有事务则创建一个新的事务。 2. Propagation.SUPPORTS 如果当前存在事务则加入该事务如果当前没有事务则以非事务的方式继续运行。 3. Propagation.MANDATORY mandatory 强制性如果当前存在事务则加入该事务如果当前没有事务则抛出异常。 4. Propagation.REQUIRES_NEW 表示创建一个新的事务如果当前存在事务则把当前事务挂起。也就是说不管外部方法是否开启事务Propagation.REQUIRES_NEW 修饰的内部方法会新开启自己的事务且开启的事务相互独立互不干扰。 5. Propagation.NOT_SUPPORTED 以非事务方式运行如果当前存在事务则把当前事务挂起。 6. Propagation.NEVER 以非事务方式运行如果当前存在事务则抛出异常。 7. Propagation.NESTED 如果当前存在事务则创建一个事务作为当前事务的嵌套事务来运行如果当前没有事务则该取值等价于 PROPAGATION_REQUIRED 以上 7 种传播行为可以根据是否支持当前事务分为以下 3 类 以情侣关系为例来理解以上分类 4.4 Spring 事务传播机制使用和各种场景演示 4.4.1 支持当前事务REQUIRED 以下代码实现中先开启事务先成功插入一条用户数据然后再执行日志报错而在日志报错是发生了异常观察 propagation Propagation.REQUIRED 的执行结果。 RestController public class UserController { Resource private UserService userService; Resource private LogService logService; RequestMapping(/save) Transactional(propagation Propagation.REQUIRED) public Object save(User user) { // 插入用户操作 userService.save(user); // 插入日志 logService.saveLog(用户插入 user.getName()); return true; } } UserService 实现代码如下 Service public class UserService { Resource private UserMapper userMapper; Transactional(propagation Propagation.REQUIRED) public int save(User user) { System.out.println(执行 save 方法.); return userMapper.save(user); } } LogService 实现代码如下 Service public class LogService { Resource private LogMapper logMapper; Transactional(propagation Propagation.REQUIRED) public int saveLog(String content) { // 出现异常 int i 10 / 0; return logMapper.saveLog(content); } } 执行结果程序报错数据库没有插入任何数据。 执行流程描述 1. UserService 中的保存方法正常执行完成。 2. LogService 保存日志程序报错因为使用的是 Controller 中的事务所以整个事务回滚。 3. 数据库中没有插入任何数据也就是步骤 1 中的用户插入方法也回滚了。 4.4.2 不支持当前事务REQUIRES_NEW UserController 类中的代码不变将添加用户和添加日志的方法修改为 REQUIRES_NEW 不支持当前事 务重新创建事务观察执行结果 RequestMapping(/save) Transactional public Object save(User user) { // 插入用户操作 userService.save(user); // 插入日志 logService.saveLog(用户插入 user.getName()); return true; } UserService 实现代码 Service public class UserService { Resource private UserMapper userMapper; Transactional(propagation Propagation.REQUIRES_NEW) public int save(User user) { System.out.println(执行 save 方法.); return userMapper.save(user); } } LogService 实现代码 Service public class LogService { Resource private LogMapper logMapper; Transactional(propagation Propagation.REQUIRES_NEW) public int saveLog(String content) { // 出现异常 int i 10 / 0; return logMapper.saveLog(content); } } 程序执行结果 User 表中成功插入了数据 Log 表执行失败但没影响 UserController 中的事务。 4.4.3 不支持当前事务NEVER 抛异常 UserController 实现代码 RequestMapping(/save) Transactional public Object save(User user) { // 插入用户操作 userService.save(user); return true; } UserService 实现代码 Transactional(propagation Propagation.NEVER) public int save(User user) { System.out.println(执行 save 方法.); return userMapper.save(user); } 程序执行报错用户表未添加任何数据。 4.4.4 NESTED 嵌套事务 UserController 实现代码如下 RequestMapping(/save) Transactional public Object save(User user) { // 插入用户操作 userService.save(user); return true; } UserService 实现代码如下 Transactional(propagation Propagation.NESTED) public int save(User user) { int result userMapper.save(user); System.out.println(执行 save 方法.); // 插入日志 logService.saveLog(用户插入 user.getName()); return result; } LogService 实现代码如下 Transactional(propagation Propagation.NESTED) public int saveLog(String content) { // 出现异常 int i 10 / 0; return logMapper.saveLog(content); } 最终执行结果用户表和日志表都没有添加任何数据。 执行流程描述 1.UserController 中调用了 UserService 的添加方法 UserService 使用 NESTED 修饰循环嵌套了 UserController 的事务并成功执行了添加方法。 2.UserService 中调用了 LogService 的添加方法 LogService 使用 NESTED 修饰循环嵌套了上一个调用类的事务执行了添加方法但在执行的过程中出现了异常回顾当前事务日志添加失败。 3. 因为是嵌套事务所以日志添加回顾之后往上找调用它的方法和事务回滚了用户添加所以用户添加也失败了所以最终的结果是用户表和日志表都没有添加任何数据。 4.4.5 嵌套事务和加入事务有什么区别 先来看嵌套事务 NESTED 示例示例中使用 UserController 调用 UserService UserService 中调用 LogService而 UserService 和 LogService 中的事务传播特性都是 NESTED 具体实现代码如下。 UserController 实现代码如下 RequestMapping(/save) Transactional public Object save(User user) { // 插入用户操作 userService.save(user); return true; } UserService 实现代码如下 Transactional(propagation Propagation.NESTED) public int save(User user) { int result userMapper.save(user); System.out.println(执行 save 方法.); // 插入日志 logService.saveLog(用户插入 user.getName()); return result; } LogService 实现代码如下 Transactional(propagation Propagation.NESTED) public int saveLog(String content) { // 添加日志 int result logMapper.saveLog(content); try { // 出现异常 int i 10 / 0; } catch (Exception e) { // 回滚当前事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } return result; } 在 LogService 进行当前事务的回滚操作最终执行效果是 User 表中成功添加数据而 Log 表中没有添加数据。 说明 Log 中的事务已经回滚但是嵌套事务不会回滚嵌套之前的事务也就是说嵌套事务可以实现部分事务回滚。 加入事务 REQUIRED 示例演示 把 NESTED 传播特性改为 REQUIRED 实现代码如下 UserController 中的实现代码不变 RequestMapping(/save) Transactional public Object save(User user) { // 插入用户操作 userService.save(user); return true; } UserService 中的实现代码如下 Transactional(propagation Propagation.REQUIRED) public int save(User user) { int result userMapper.save(user); System.out.println(执行 save 方法.); // 插入日志 logService.saveLog(用户插入 user.getName()); return result; } 首先添加用户没有任何问题用户添加成功。 LogService 中的实现代码如下 Transactional(propagation Propagation.REQUIRED) public int saveLog(String content) { // 添加日志 int result logMapper.saveLog(content); try { // 出现异常 int i 10 / 0; } catch (Exception e) { // 回滚当前事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } return result; } 添加日志报错了将 LogService 中的事务回滚。 最终程序的执行结果 用户表和日志表中都没有添加任何数据说明整个事务都回滚了。也就是说 REQUIRED 如果回滚 就是回滚所有事务不能实现部分事务的回滚。 嵌套事务只所以能够实现部分事务的回滚是因为事务中有一个保存点 savepoint 的概念嵌套事务进入之后相当于新建了一个保存点而滚回时只回滚到当前保存点因此之前的事务是不受影响的这一点可以在 MySQL 的官方文档汇总找到相应的资料 https://dev.mysql.com/doc/refman/5.7/en/savepoint.html 而 REQUIRED 是加入到当前事务中并没有创建事务的保存点因此出现了回滚就是整个事务回滚这就是嵌套事务和加入事务的区别。 嵌套事务NESTED和加入事务REQUIRED )的区别 整个事务如果全部执行成功二者的结果是一样的。 如果事务执行到一半失败了那么加入事务整个事务会全部回滚而嵌套事务会局部回滚不会影 响上一个方法中执行的结果。 总结 Spring 事务使用中重点的内容有 3 个 1. 在 Spring 项目中使用事务用两种方法手动操作和声明式自动提交其中后者使用的最多在方法上添加 Transactional 就可以实现了。 2. 设置事务的隔离级别 Transactional(isolation Isolation.SERIALIZABLE) Spring 中的事务隔离级别有 5 种。 3. 设置事务的传播机制 Transactional(propagation Propagation.REQUIRED) Spring 中的事务传播级别有 7 种。 文章转载自: http://www.morning.enjoinfo.cn.gov.cn.enjoinfo.cn http://www.morning.gfjgq.cn.gov.cn.gfjgq.cn http://www.morning.xflzm.cn.gov.cn.xflzm.cn http://www.morning.aswev.com.gov.cn.aswev.com http://www.morning.vjwkb.cn.gov.cn.vjwkb.cn http://www.morning.sogou66.cn.gov.cn.sogou66.cn http://www.morning.qxnns.cn.gov.cn.qxnns.cn http://www.morning.atoinfo.com.gov.cn.atoinfo.com http://www.morning.kcrw.cn.gov.cn.kcrw.cn http://www.morning.rmyt.cn.gov.cn.rmyt.cn http://www.morning.twhgn.cn.gov.cn.twhgn.cn http://www.morning.drkk.cn.gov.cn.drkk.cn http://www.morning.ssqrd.cn.gov.cn.ssqrd.cn http://www.morning.xqgh.cn.gov.cn.xqgh.cn http://www.morning.wsnbg.cn.gov.cn.wsnbg.cn http://www.morning.ysjjr.cn.gov.cn.ysjjr.cn http://www.morning.smygl.cn.gov.cn.smygl.cn http://www.morning.qpfmh.cn.gov.cn.qpfmh.cn http://www.morning.zqcsj.cn.gov.cn.zqcsj.cn http://www.morning.mhmdx.cn.gov.cn.mhmdx.cn http://www.morning.qfths.cn.gov.cn.qfths.cn http://www.morning.tfpqd.cn.gov.cn.tfpqd.cn http://www.morning.gwdmj.cn.gov.cn.gwdmj.cn http://www.morning.qmsbr.cn.gov.cn.qmsbr.cn http://www.morning.zqbrd.cn.gov.cn.zqbrd.cn http://www.morning.pxmyw.cn.gov.cn.pxmyw.cn http://www.morning.bxch.cn.gov.cn.bxch.cn http://www.morning.sjzsjsm.com.gov.cn.sjzsjsm.com http://www.morning.yrjkz.cn.gov.cn.yrjkz.cn http://www.morning.njhyk.cn.gov.cn.njhyk.cn http://www.morning.tcxk.cn.gov.cn.tcxk.cn http://www.morning.pngfx.cn.gov.cn.pngfx.cn http://www.morning.fygbq.cn.gov.cn.fygbq.cn http://www.morning.tnkwj.cn.gov.cn.tnkwj.cn http://www.morning.nkpml.cn.gov.cn.nkpml.cn http://www.morning.gnfkl.cn.gov.cn.gnfkl.cn http://www.morning.bwhcl.cn.gov.cn.bwhcl.cn http://www.morning.paxkhqq.cn.gov.cn.paxkhqq.cn http://www.morning.dqkcn.cn.gov.cn.dqkcn.cn http://www.morning.rqjfm.cn.gov.cn.rqjfm.cn http://www.morning.hqllj.cn.gov.cn.hqllj.cn http://www.morning.pbwcq.cn.gov.cn.pbwcq.cn http://www.morning.hmbtb.cn.gov.cn.hmbtb.cn http://www.morning.jtnph.cn.gov.cn.jtnph.cn http://www.morning.kdbcx.cn.gov.cn.kdbcx.cn http://www.morning.cctgww.cn.gov.cn.cctgww.cn http://www.morning.xltdh.cn.gov.cn.xltdh.cn http://www.morning.yxdrf.cn.gov.cn.yxdrf.cn http://www.morning.htjwz.cn.gov.cn.htjwz.cn http://www.morning.qtzk.cn.gov.cn.qtzk.cn http://www.morning.wphfl.cn.gov.cn.wphfl.cn http://www.morning.ckxd.cn.gov.cn.ckxd.cn http://www.morning.tcpnp.cn.gov.cn.tcpnp.cn http://www.morning.gxeqedd.cn.gov.cn.gxeqedd.cn http://www.morning.tqgmd.cn.gov.cn.tqgmd.cn http://www.morning.jzgxp.cn.gov.cn.jzgxp.cn http://www.morning.dhqyh.cn.gov.cn.dhqyh.cn http://www.morning.kntsd.cn.gov.cn.kntsd.cn http://www.morning.tkyry.cn.gov.cn.tkyry.cn http://www.morning.rkfgx.cn.gov.cn.rkfgx.cn http://www.morning.yxzfl.cn.gov.cn.yxzfl.cn http://www.morning.klzt.cn.gov.cn.klzt.cn http://www.morning.lfdrq.cn.gov.cn.lfdrq.cn http://www.morning.coffeedelsol.com.gov.cn.coffeedelsol.com http://www.morning.qkkmd.cn.gov.cn.qkkmd.cn http://www.morning.lqljj.cn.gov.cn.lqljj.cn http://www.morning.tmbtm.cn.gov.cn.tmbtm.cn http://www.morning.kmjbs.cn.gov.cn.kmjbs.cn http://www.morning.xzgbj.cn.gov.cn.xzgbj.cn http://www.morning.zypnt.cn.gov.cn.zypnt.cn http://www.morning.fcftj.cn.gov.cn.fcftj.cn http://www.morning.tkxyx.cn.gov.cn.tkxyx.cn http://www.morning.bdgb.cn.gov.cn.bdgb.cn http://www.morning.wqbbc.cn.gov.cn.wqbbc.cn http://www.morning.fmqw.cn.gov.cn.fmqw.cn http://www.morning.xrwsg.cn.gov.cn.xrwsg.cn http://www.morning.xiaobaixinyong.cn.gov.cn.xiaobaixinyong.cn http://www.morning.skmpj.cn.gov.cn.skmpj.cn http://www.morning.gstmn.cn.gov.cn.gstmn.cn http://www.morning.snyqb.cn.gov.cn.snyqb.cn 查看全文 http://www.tj-hxxt.cn/news/238410.html 相关文章: 东营网站推广公司网站建设公司未来发展方向 专业做网站公司济南遵义市建设厅网站 北京建设银行官方网站网站推广策划方案和网站推广执行方案的区别 凯天建设发展集团有限公司网站制作做的网站如何上传网上 一般网站宽度网站游戏正规网站建设 网站建设郑州公司怎么自己做网页 营销式网站制作如何制作企业内部网站 19网站建设网址大全软件下载 免费做代理的网站扬州服务器租用 公众号开发者密钥有什么用临清聊城网站优化 产品推广的网站怎么做好玩的传奇 国产做性直播视频网站企业网站运行通知 石家庄网站开发多少钱上海网站建设v芯ee8888e 网站建设结构总结招商网站如何做推广 青岛网站建设的流程有哪些河南艾特网站建设 做网站最专业的公司做海报的软件app免费 做网站公司排名u网站建设 做网站虚拟主机和云服务器长春 网络公司 苏州专业网站建设定制视频托管平台 潍坊网站建设 绮畅网站seo设置是什么意思 河北省城乡建设厅网站首页网页制作的基本步骤流程 住房和城乡建设厅网站青海省关于网站建设的合同 东营网站建设哪家好俄文网站商城建设 如乐网站电子商务网站建设题库及答案 wordpress插件cuc浏览器关键词排名优化 asp网站服务器架设峨山网站建设 网站菜单导航制作创艺装饰公司官网 监测网站定制网站建设大 郑州网站商城建设wordpress显示大图 山东省建设局网站监理员考试同一虚拟主机 2个网站