您的位置:新葡亰496net > 网络数据库 > 新葡亰496net:管住事务

新葡亰496net:管住事务

发布时间:2019-07-20 12:44编辑:网络数据库浏览(140)

    一、事物的介绍
    ①一个或者一组SQL语句组成一个执行的单元,这个单元要么全部执行(commit),要么全部不执行(rollback),可以理解为一个最小的不可分割的单元,主要保证数据的一致性。
    ②在MySQL中只有Innodb数据库引擎支持事物。
    ③只有DML语句才有事物,主要有(insert、update、delete)。
    二、事物的分类
    ①扁平事物
    最简单的事物,使用最多的事物,由BEGIN WORK开始,由COMMIT WORK 或者 ROLLBACK WORK结束,之间的操作都是原子性的,要么全部执行,要么全部回滚。
    ②带保存点的事物
    基于扁平事物之上的,允许在事物执行过程中回滚到事物中较早的一个状态。
    ③链事物
    保存点事物的一个变种,保存点事物在系统宕机时候,所有的保存点是易丢失的,当系统重新恢复的时候,事物需要重新开始执行,不能从最近的保存点断点执行。链事物是指在提交事物的时候,释放不需要的数据对象,将必要的处理上下文的隐式的传给下一个要开始的事物,提交事物和开启下一个事物合并为一个原子操作,像一个事物在执行。链事物的回滚只针对于当前的保存点,带保存点的事物能回滚到任意正确的保存点。
    ④嵌套事物
    嵌套事物是一个层次的结构框架,一个顶层的事物控制着各个层次的事物,顶层之下嵌套的事物称为子事物,父事物回滚,子事物也会跟着回滚,子事物具体ACI属性,不具有D的特性。
    ⑤分布式事物
    分布式事物是在分布式环境下运行的扁平事物。
    注:Mysql 的innodb数据库引擎,不支持嵌套事物,其余均支持。
    三、事物的特性(ACID)
    ①原子性(Atomicity)
    一个事物中的所有操作,要么全部完成,要么全部不完成,不会结束在某个环节。事物在执行的过程中发生的错误,会被回滚到事物开始前的状态,就像整个事物从来没有执行过一样。
    ②一致性(Consistency)
    一致性是指事务将数据库从一种状态转变为另一种状态,在事物开始之前和事物结束之后,数据库的完整性没有被破坏。
    ③隔离性(Isolation)
    数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
    ④持久性(Durability)
    事物处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。
    四、事物的创建
    1.隐式事物和显式事物
    隐式事物:事物没有明显的开始结束标志,类似于insert、update、delet语句。
    显式事物:事物具有明显的开始或者结束标志
    因为mysql的innodb数据库引擎的事物默认是开启状态,显式事物的开启的前提是将自动提交功能设置为禁用。
    2.事物控制语句
    ①start transaction | begin:显式的开启事物。前提将autocommit关闭。
    ②commit:提交事物,只要执行正确的指令,对数据的修改是永久性。
    ③rollback:取消所有事物,并撤销正在进行的所有未提交的修改。
    ④savepoint spname:在事物中创建保存点。
    ⑤release savepoint spname:删除事物的保存点。
    ⑥rollback to spname:把事物回滚到标记点,回滚点事前的事物成功,之后的回滚。
    ⑦ select @@autocommit:查询事物是自动提交状态
    show variables like "autocommit";
    ⑧set autocommit = 0:禁用自动提交
    set autocommit = 1:开启自动提交
    ⑨查看隔离级别
    select @@tx_isolation;
    ⑩设置隔离级别
    set global | session transaction isolation level 隔离级别;
    3.演示事物
    准备数据
    新葡亰496net 1
    案例1:沉醉向花花转账20元
    新葡亰496net 2
    案例2:沉醉向花花转账100,系统突然出错
    新葡亰496net 3
    案例3:事物演示delete 和 truncate
    delet支持事物,truncate不支持事物
    新葡亰496net 4
    新葡亰496net 5
    案例4:savepoint的演示
    新葡亰496net 6
    五、并发事物问题和事物的隔离级别
    1.并发事物处理带来的问题
    ①脏读
    一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做”脏读”。
    事务A读取到了事务B已修改但尚未提交的的数据,还在这个数据基础上做了操作。此时,如果B事务回滚,A读取的数据无效,不符合一致性要求。
    ②不可重复读
    一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读”。
    事务A读取到了事务B已经提交的修改数据,不符合隔离性
    ③幻读
    一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。
    事务A读取到了事务B体提交的新增数据,不符合隔离性。
    注意:
    脏读是事务B里面修改了数据。
    幻读是事务B里面新增了数据。
    2.事物隔离级别
    ①read uncommitted(读未提交):事物的修改,即使没有提交,对其他事物也是可见的。事物读未提交的数据成为脏读。
    ②read committed(读以提交):一个事物在提交之前,所做的任何修改对其他事物都是不看见,但是对其他事物称为不可重复读,因为两次查询的结果可能不一样。
    ③repeatable read(可重复读):该级别解决了脏读、不可重复读的问题,保证了在一个事物中多次读到的数据是一致的,但是没有解决幻读的问题。
    ④serializable(串行化):会在读取每行数据的时候加锁,避免了幻读的问题。
    3.事物隔离级别演示
    ①读未提交
    新葡亰496net 7
    ②读已提交 但是不能避免重复读
    新葡亰496net 8
    如果左边提交了,右面会读到两次不一样的数据
    新葡亰496net 9
    ③可重复读
    新葡亰496net 10
    新葡亰496net 11
    没有避免幻读
    新葡亰496net 12
    ④串行化
    新葡亰496net 13
    新葡亰496net 14
    阻塞状态,一方提交另一方才能进行下一步操作,可以避免幻读,但是处理高并发效率较低,mysql默认为第三级别。
    新葡亰496net 15
    数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上 “串行化”进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏感,可能更关心数据并发访问的能力。

     

    一、介绍

    MySQL事务:一组原子性的SQL查询,或者说一个独立工作单元

    MySQL事务:一组原子性的SQL查询,或者说一个独立工作单元

    什么是事务

      mysql支持几种基本的数据库引擎,其中MYSQL的两种最基本的引擎MyISAM和InnoDB,其中只有InnoDB支持事务管理。

    一个支持事务的存储引擎或者关系型数据库必然满足ACID测试

    一个支持事务的存储引擎或者关系型数据库必然满足ACID测试


      事务处理:可以用来维护数据库的完整性,他保证成批的MySQL操作要么完全执行,要么不完全执行。

    A:atomicity,原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚

    A:atomicity,原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚

     

      事务处理是一种机制,用来管理必须成批执行的MYSQL操作,以保证数据库不包含不完整的操作结果。

    C:consistency, 一致性;数据库总是从一个一致性状态转换为另一个一致性状态

    C:consistency, 一致性;数据库总是从一个一致性状态转换为另一个一致性状态

    一系列有序的数据库操作:

     

    I:Isolation,隔离性;一个事务所做出的操作在提交之前,是不能为其它所见;隔离有多种隔离级别

    I:Isolation,隔离性;一个事务所做出的操作在提交之前,是不能为其它所见;隔离有多种隔离级别

    • 要么全部成功
    • 要么全部回退到操作前状态
    • 中间状态对其他连接不可见

    二、事务的几个基本术语

    D:durability: 持久性;一旦事务提交,其所做的修改会永久保存于数据库中

    D:durability: 持久性;一旦事务提交,其所做的修改会永久保存于数据库中

     

      事务(transaction):指一组SQL语句

     

     

    事务的基本操作

      回退(rollback):指撤销指定SQL语句的过程

    事务生命周期:启动事务START TRANSACTION-->执行sql语句-->结束事务:(1) COMMIT:提交  或者  (2) ROLLBACK: 回滚

    事务生命周期:启动事务START TRANSACTION-->执行sql语句-->结束事务:(1) COMMIT:提交  或者  (2) ROLLBACK: 回滚

     

      提交(commit):指将未存储的SQL语句结果写入数据库表。

    注意:只有事务型存储引擎方能支持此类操作

    注意:只有事务型存储引擎方能支持此类操作

    基本操作 说明
    start transaction; 开始事务
    commit; 提交(全部完成)
    rollback; 回滚(回到初始状态)

      保留点(savepoint):指事务处理中设置的临时占位符,你可以对它发布回退(与回退整个事务处理不同)

     

     

     

     

    新葡亰496net 16

    新葡亰496net 17

    新葡亰496net 18.png)

    三、控制事务处理

     

     

     

      事务开始:

    autocommit                  | ON     每条sql语句当作一个事务自动提交(这会影响系统i/o性能)

    autocommit                  | ON     每条sql语句当作一个事务自动提交(这会影响系统i/o性能)

     

        start transaction;

    建议:显式请求和提交事务,而不要使用“自动提交”功能  set autocommit=0

    建议:显式请求和提交事务,而不要使用“自动提交”功能  set autocommit=0

     

      1、使用ROLLBACK:MySQL用这个命令来回退(撤销)MySQL语句:

     

     

     

        select * from ordertotal;

    事务支持savepoint

    事务支持savepoint

     

        start transaction;

      SAVEPOINT identifier    例如:savepoint sp1  savepoint sp2

      SAVEPOINT identifier    例如:savepoint sp1  savepoint sp2

    新葡亰496net 19

        delete from transaction;

      ROLLBACK [WORK] TO [SAVEPOINT] identifier    例如:rollback to sp2

      ROLLBACK [WORK] TO [SAVEPOINT] identifier    例如:rollback to sp2

     

        select * from ordertotals;

      RELEASE SAVEPOINT identifier    例如:release savepoint sp1

      RELEASE SAVEPOINT identifier    例如:release savepoint sp1

    图中便是数据库中的事务操作;及 开始事务-->SQL操作-->commit/rollback;

        rollbaclk;

      

      

    新葡亰496net:管住事务。savepoint,保存点,在事务回滚时,可以回滚到保存点;

        select * from ordertotals;

    事务隔离级别:

    事务隔离级别:

    而提交只能全部提交不能仅提交保存点;

        虽然已经删除数据,但是我们在提交之前使用了rollback,那么在进行查询的时候,已经删除了的数据又恢复了。

      READ UNCOMMITTED (读未提交): 另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)

      READ UNCOMMITTED (读未提交): 另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)

     

        rollback只能在一个事务处理内使用,事务处理用来管理insert,update和delete语句,而select,create,drop等都不能使用事务管理。

     

     

    savepoint  savepoint_name;
    rollback to savepoint_name;
    commit;
    

      

      READ COMMITTED (读提交): 本事务读取到的是其他事务提交后的最新数据。问题是在同一个事务里,如果其他事务修改两次当前事务前后两次相同的SELECT会读到不同的结果(不重复读)

      READ COMMITTED (读提交): 本事务读取到的是其他事务提交后的最新数据。问题是在同一个事务里,如果其他事务修改两次当前事务前后两次相同的SELECT会读到不同的结果(不重复读)

    事务开始也可以用 begin;或者 start transaction;

        2、使用commit:在事务处理中,提交并不会隐含的进行,为进行明确的提交,使用commit语句。

     

     

     

          start transaction;

      REPEATABLE READ (可重读):在同一个事务里,SELECT的结果是事务开始时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象

      REPEATABLE READ (可重读):在同一个事务里,SELECT的结果是事务开始时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象

    清空表数据:

          delete from orderitems where order_num=20010;

     

     

     

          delete from orders where order_num=20010;

      SERIALIZABILE (可串行化):一个事务未提交时,另一个事务对同一数据做操作时会被阻塞

      SERIALIZABILE (可串行化):一个事务未提交时,另一个事务对同一数据做操作时会被阻塞

    mysql> select * from ttt;
     --- ------ ------ 
    | a | b    | c    |
     --- ------ ------ 
    | 1 |    1 |    1 |
     --- ------ ------ 
    1 row in set (0.00 sec)
    mysql> truncate table ttt;
    Query OK, 0 rows affected (0.01 sec)
    mysql> select * from ttt;
    Empty set (0.00 sec)
    

          commit;

     

     

    当多个连接同时连在一个数据库中时,truncate 命令无法使用

     

    存在的问题:脏读(另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据)

    存在的问题:脏读(另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据)

     

        3、使用保留点:简单的rollback和commit语句就可以写入或撤销整个事务处理,但是更复杂的事务处理可能需要部分提交或回退。

          不可重复读(解决了脏读后,会遇到,同一个事务执行过程中,另外一个事务提交了新数据,因此本事务先后两次读到的数据结果会不一致)

          不可重复读(解决了脏读后,会遇到,同一个事务执行过程中,另外一个事务提交了新数据,因此本事务先后两次读到的数据结果会不一致)

     

       为了支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符,这样需要回退,可以回退到某个占位符。

          幻读(解决了不可重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)但是如果另一个事务同时提交了新数据例如30改为40,这时在底层看到同一数据有30和40两个值)

          幻读(解决了不可重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)但是如果另一个事务同时提交了新数据例如30改为40,这时在底层看到同一数据有30和40两个值)

    自动提交(默认开启)

       savepoint delete1;

          加锁读:当在高并发时,可能会导致一场噩梦,不过最大限度地提高了数据的安全性

          加锁读:当在高并发时,可能会导致一场噩梦,不过最大限度地提高了数据的安全性


       rollback to delete1;  

     

     

     

        

    查看隔离级别:

    查看隔离级别:

    即在我们数据语句后,系统自动给我们加上了COMMIT;

        4、更改默认的提交方式

    新葡亰496net 20

    新葡亰496net 21

    • autocommit可以在session级别设置
    • 每个DML操作都自动提交
    • DDL永远是自动提交,无法通过rollback回滚

      mysql> show variables like '%autocommit%'; --------------- ------- | Variable_name | Value | --------------- ------- | autocommit | ON | --------------- ------- 1 row in set (0.00 sec)

      mysql> set session autocommit = 0; Query OK, 0 rows affected (0.00 sec)

      mysql> show variables like '%autocommit%'; --------------- ------- | Variable_name | Value | --------------- ------- | autocommit | OFF | --------------- ------- 1 row in set (0.00 sec)

          默认的mysql行为是自动提交所有的改动,但是你可以设置Mysql不自动提交修改,如下:  

     

     

    此时,在这个session中将DML将不会自动提交;

          set autocommit=0;

    死锁:两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,解决死锁主要针对于最常用的InnoDB

    死锁:两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,解决死锁主要针对于最常用的InnoDB

     

     

     

     

    而如果在DML语句后我们进行了一句 DDL语句:

    三、事务隔离级别

    查看事务日志:

    查看事务日志:

    alter table ttt add new int(11);增加了一个字段;此时之前的DML也会自动提交,

        事务隔离性:是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

    新葡亰496net 22

    新葡亰496net 23

    因为DDL永远都会在语句后面自动COMMIT,而也顺带把之前的DML语句也提交了;

        1、串行化(Serializable):所有事务一个接一个执行,这样可以避免幻读(phantom read),对于基于锁来实现的并发控制的数据库来说,串行化要求在执行范围查询的时候,需要获取范围锁,如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需回滚该事务。  

    innodb_log_buffer_size   缓存中事务日志的大小

    innodb_log_buffer_size   缓存中事务日志的大小

     

        2、可重复读(repeated read):所有被select获取的数据都不能被修改,这样就可以避免一个事务前后读取不一致的情况。但是没有办法控制幻读,因为这个时候事务不能更改所选的数据,但是可以增加数据,因为强恶意事务没有范围锁。(事务a读取数据,事务b可以同样读取,不可以更改数据,但是可以增加数据)

    innodb_log_file_size        磁盘事务日志文件大小

    innodb_log_file_size        磁盘事务日志文件大小

     基本属性

        3、读已提交(read commit):被读取的数据可以被其他事务修改,这样可能导致不可重复读,也就是说,事务读取的时候,获取读锁,但是在读完之后立即释放(不需要等事务结束),而写锁则是事务提交之后才释放的,释放读锁之后就可能被其他事务修改数据。改等级也是sql server默认的隔离等级。(事务a读取数据,事务b不可以读取数据,事务b可以修改数据)

    innodb_log_files_in_group   几个事务日志文件

    innodb_log_files_in_group   几个事务日志文件


        4、读未提交(read uncommitted):最低的隔离等级,允许其他事物看到没有提交的数据,会导致脏读。

    innodb_log_group_home_dir     事务日志文件存放位置

    innodb_log_group_home_dir     事务日志文件存放位置

     

     

    事务日志文件名:

    事务日志文件名:

    事务的四个基本属性(ACID)酸

        总结:1、四个级别逐渐增强,每个级别解决一问题;

    新葡亰496net 24

    新葡亰496net 25

    • 原子性(Atomicity)
    • 一致性(Consistency)
    • 隔离性(Isolation)
    • 持久性(Durability)

            2、事务级别越低,性能越差,大多数环境read committed就可以用了。

    以上几个参数不支持运行时修改,需要修改配置文件并从新启动

    以上几个参数不支持运行时修改,需要修改配置文件并从新启动

     

    事务的原子性(事务被打包一起执行或者一起撤销)

    • 包含在事务中的操作要么全部被执行,要么都不执行
    • 中途数据库或者应用发生异常,未提交的事务都应该被回滚

     

    事务的一致性(各种约束条件,保证事务的正确合理,完成性)

    数据正确性,合理性,完整性

    数据一致性应该符合应用需要规则

    •      余额不能为负数
    •      交易对象必须先有账号
    •      用户账号不能重复

    事务的结果需要满足数据的一致性约束

     

     

    事务的持久性(提交后的事务持久化到磁盘)

    •     提交完成的事务会数据库的影响必须是永久性的
    •      数据库异常不会丢失事务更新
    •      通常认为成功写入磁盘的数据即为持久化成功

     

    事务的持久化实现

    新葡亰496net 26.png)

    新葡亰496net 27

     

    机械硬盘对随机的读写非常慢,所以数据并不是同步刷新的。当update set a =3 ,commit ;

    顺序写到事务日志中去,然后在空闲时,顺序的异步刷新到磁盘中去;这样速度回比较快,

    因为机械硬盘对顺序读写操作的速度还是很快的。但如果数据库发现异常宕机了,

    此时磁盘上的记录并没有得到修改,这时候需要通过回放事务日志的方式,也就是通过事务日志,重新将事务,更新到磁盘中去。

     

     

    事务的隔离性

         数据库事务在提交完成前,中间的任何数据变化对其他的事务都是不可见的。

    新葡亰496net 28.png)

     新葡亰496net 29

    新葡亰496net 30

     

    隔离现象

    • 脏读:Dirty Read  
    • 不可重复读:NonRepeatable Read
    • 幻读:Phantom Read

     

    隔离等级

    • 未提交读:Read uncommitted
    • 已提交读:Read committed
    • 可重复读:Repeatable  Read
    • 可串行化:Seriallizable

     

    mysql的事务隔离级别


     

     

     新葡亰496net 31

     

    新葡亰496net 32

     

     

    新葡亰496net 33.png)

    tx_isolation 设置隔离级别;

     

    数据库的隔离现象与隔离级别的演示

    新葡亰496net 34.png)

    新葡亰496net 35

     

     

    隔离现象

    1. 脏读:Dirty Read  
    2. 不可重复读:NonRepeatable Read
    3. 幻读:Phantom Read

     

    隔离等级

    1. 未提交读:Read uncommitted
    2. 已提交读:Read committed
    3. 可重复读:Repeatable  Read
    4. 可串行化:Seriallizable

     

     

    默认情况下:

    查看隔离级别:

    mysql> show global variables like "%iso%";
     --------------- ----------------- 
    | Variable_name | Value           |
     --------------- ----------------- 
    | tx_isolation  | REPEATABLE-READ |
     --------------- ----------------- 
    

     

    修改隔离级别:

    set global  tx_isolation = 'READ-COMMITTED ';
    

     

    READ UNCOMMITTED (未提交读) 的 dirty read(脏读)现象:

    脏读现象:即A连接,未提交的事务,B连接的事务可以看到;

     

    READ COMMITTED(已提交读)的NONREPEATABLE READ(不可重复读)现象:

    A连接,提交的事务,B连接的事务中可以看到,这样在B连接中的事务,就可以看到A连接事务提交前,和提交后两种状态;PS:叫可重复读不是更贴切?

    注意:不可重复读针对update,delete

     

     

    READ COMMITTED(已提交读)的PHANTOM READ(幻读)现象:

    A连接,提交的事务,B连接的事务可以看到,这样在B连接中的事务,就可以看到A连接事务提交前,和提交后两种状态;

    注意:幻读针对insert;

     

     

    REPEATABLE-READ(可重复读)的PHANTOM READ(幻读)现象:

    但是在mysql中innodb事务引擎,将可重复读的幻读现象也消除掉了;

    通过gap lock  间隙锁来 粗暴的实现

     

    可重复读:即消除了不可重复读的现象;

     

    事务与并发写


     

    某个正在更新的记录在提交或回滚前不能被其他事务同时更新;

    新葡亰496net 36.png)

    新葡亰496net 37

    引入锁的概念;在innodb中会具体讲解;

    并发写是不允许的,而如果A事务写,B事务读是可以的。这个读受到数据库隔离级别的影响;

     

    innodb 使用MVCC非锁定读技术,从undo log中读取行记录的快照;这样读行就不需要等待锁资源,提高了并发;

     

    数据库回滚的实现


     

    回滚段(rollback segment)与数据前像

    新葡亰496net 38.png)

     新葡亰496net 39

    • 回滚段也帮助实现事务的隔离性
    • InnoDB存储引擎异常恢复过程中需要用到回滚段..

    总结


     

    • savepoint:可以回滚到保存点,不可以提交保存点
    • 清空表数据:truncate table tbl
    • autocommit:DML可以设置不自动提交,DDL永远自动提交
    • ACID
      •   事务的原子性(事务被打包一起执行或者一起撤销)
      •   事务的一致性(各种约束条件,保证事务的正确合理,完成性)
      •   事务的持久性(提交后的事务持久化到磁盘)
      •   事务的隔离性:
          •   隔离现象:脏读,不可重复读--update,delete,幻读--insert;
          •   隔离等级:未提交读,已提交读,可重复读,可串行化
    • innodb默认repeatable read
    • innodb的repeatable read 消除了幻读现象通过gap lock 间隙锁粗暴实现;
    • 非锁定读技术:MVCC,从undo log读取行记录快照
    • 数据库回滚的实现:回滚段与数据前像;

     

    本文由新葡亰496net发布于网络数据库,转载请注明出处:新葡亰496net:管住事务

    关键词: