您好、欢迎来到现金彩票网!
当前位置:彩运网 > 封锁粒度 >

数据库中的事务与死锁

发布时间:2019-07-02 23:22 来源:未知 编辑:admin

  并发控制: 事务和锁的存在都是为了更好的解决并发访问造成的数据不一致性的的问题

  **乐观锁和悲观锁都是为了解决并发控制问题, 乐观锁可以认为是一种在最后提交的时候检测冲突的手段,而悲观锁则是一种避免冲突的手段。 **

  是应用系统层面和数据的业务逻辑层次上的(实际上并没有加锁,只不过大家一直这样叫而已),利用程序处理并发,它假定当某一个用户去读取某一个数据的时候,其他的用户不会来访问修改这个数据,但是在最后进行事务的提交的时候会进行版本的检查,以判断在该用户的操作过程中,没有其他用户修改了这个数据。开销比较小

  乐观锁的实现大部分都是基于版本控制实现的, 除此之外,还可以通过时间戳的方式,通过提前读取,事后对比的方式实现 。譬如mysql里添加版本version字段来控制

  优势:如果数据库记录始终处于悲观锁加锁状态,可以想见,如果面对几百上千个并发,那么要不断的加锁减锁,而且用户等待的时间会非常的长, 乐观锁机制避免了长事务中的数据库加锁解锁开销,大大提升了大并发量下的系统整体性能表现 所以如果系统的并发非常大的话,悲观锁定会带来非常大的性能问题,所以建议就要选择乐观锁定的方法, 而如果并发量不大,完全可以使用悲观锁定的方法。乐观锁也适合于读比较多的场景。

  劣势: 但是乐观锁也存在着问题,只能在提交数据时才发现业务事务将要失败,如果系统的冲突非常的多,而且一旦冲突就要因为重新计算提交而造成较大的代价的话,乐观锁也会带来很大的问题,在某些情况下,发现失败太迟的代价会非常的大。而且乐观锁也无法解决脏读的问题

  完全依赖于数据库锁的机制实现的,在数据库中可以使用Repeatable Read的隔离级别(可重复读)来实现悲观锁。它认为当某一用户读取某一数据的时候,其他用户也会对该数据进行访问,所以在读取的时候就对数据进行加锁, 在该用户读取数据的期间,其他任何用户都不能来修改该数据,但是其他用户是可以读取该数据的, 只有当自己读取完毕才释放锁。

  以hibernate为例,可以通过为记录添加版本或时间戳字段来实现乐观锁,一旦发现出现冲突了,修改失败就要通过事务进行回滚操作。可以用session.Lock()锁定对象来实现悲观锁(本质上就是执行了SELECT * FROM t FOR UPDATE语句)

  共享锁(读锁) 在同一个时间段内,多个用户可以读取同一个资源,读取的过程中数据不会发生任何变化。读锁之间是相互不阻塞的, 多个用户可以同时读,但是不能允许有人修改, 任何事务都不允许获得数据上的排它锁,直到数据上释放掉所有的共享锁

  排它锁(写锁) 在任何时候只能有一个用户写入资源,当进行写锁时会阻塞其他的读锁或者写锁操作,只能由这一个用户来写,其他用户既不能读也不能写。

  开销较小,一旦有用户访问这个表就会加锁,其他用户就不能对这个表操作了,应用程序的访问请求遇到锁等待的可能性比较高。

  是MySQL中比较独特的一种锁定级别,锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。

  开销较大,能具体的锁定到表中的某一行数据,但是能更好的支持并发处理, 会发生死锁

  所谓数据一致性,就是当多个用户试图同时访问一个数据库,它们的事务同时使用相同的数据时,可能会发生以下四种情况:

  所谓数据完整性,数据库中的数据是从外界输入的,而数据的输入由于种种原因,会发生输入无效或错误信息。保证输入的数据符合规定,

  原子性Automicity,一个事务内的所有操作,要么全做,要么全不做

  一致性Consistency,数据库从一个一致性状态转到另一个一致性状态

  独立性(隔离性)isolation, 一个事务在执行期间,对于其他事务来说是不可见的

  持久性(Durability): 事务一旦成功提交,则就会永久性的对数据库进行了修改

  READ COMMITED(提交读) 大多数数据库的默认隔离级别, 保证了不可能脏读,但是不能保证可重复读, 在这个级别里,数据的加锁实现是读取都是不加锁的,但是数据的写入、修改和删除是需要加锁的。

  REPEATABLE READ (可重复读) 解决了不可重复读的问题,保证了在同一个事务之中,多次读取相同的记录的值的结果是一致的。 但是无法解决幻读。这个阶段的事务隔离性,在mysql中是通过基于乐观锁原理的多版本控制实现的。

  SERIALIZABLE (可串行化读) 最高的隔离级别,解决了幻读 ,它会在读取的每一行数据上都进行加锁, 有可能导致超时和锁争用的问题。

  它的加锁实现是读取的时候加共享锁,修改删除更新的时候加排他锁,读写互斥,但是并发能力差。

  丢失更新: 当两个或者多个事务同时对某一数据进行更新的时候,事务B的更新可能覆盖掉事务A的更新,导致更新丢失

  事务可以读取未提交的数据,比如: 事务A对某一个数据data=1000 进行了修改: data = 2000, 但是还没有提交; 事务B读取data 得到了结果data = 2000, 由于某种原因事务A撤销了刚才的操作,数据data = 1000 然后提交 这时事务B读取到的2000就是脏数据。正确的数据应该还是 1000

  解决方法 : 把数据库的事务隔离级别调整到READ_COMMITTED , 但是存在事务A与B都读取了data,A还未完成事务,B此时修改了数据data,并提交, A又读取了data,发现data不一致了,出现了不可重复读。

  在同一个事务之中,多次读取相同的记录的值的结果是不一样的,针对的是数据的修改和删除。

  解决办法; 把数据库的事务隔离级别调整到 REPEATABLE READ , 读取时候不允许其他事务修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题

  幻读: 当某个事务在读取某个范围内的记录的时候,另外一个事务在这个范围内增加了一行,当前一个事务再次读取该范围的数据的时候就会发生幻行,. 针对的是数据的插入insert

  解决方案 : 采用的是范围锁 RangeS RangeS_S模式,锁定检索范围为只读 或者 把数据库的事务隔离级别调整到SERIALIZABLE_READ, MySQL中InnoDB 和 XtraDB 利用(多版本并发控制)解决了幻读问题,

  因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些数据,然后全部锁住,在方法运行之后,再全部解锁。这种方式可以有效的避免循环死锁,但在数据库中却不适用,因为在事务开始阶段,数据库并不知道会用到哪些数据。

  加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁(共享锁,其它事务可以继续加共享锁,但不能加排它锁),在进行写操作之前要申请并获得X锁(排它锁(只有当前数据无共享锁,无排它锁之后才能获得),其它事务不能再获得任何锁)。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。

  解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。

  这种方式虽然无法避免死锁,但是两段锁协议可以保证事务的并发调度是串行化(串行化很重要,尤其是在数据恢复和备份的时候)的。

  **指两个事务或者多个事务在同一资源上相互占用,并请求对方所占用的资源,从而造成恶性循环的现象。 **

  数据库也会发生死锁的现象,数据库系统实现了各种死锁检测和死锁超时机制来解除死锁,锁监视器进行死锁检测,MySQL的InnoDB处理死锁的方式是 将持有最少行级排它锁的事务进行回滚,相对比较简单的死锁回滚办法

  系统对进程发出每一个资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配.这是一种保证系统不进入不安全或者死锁状态的动态策略。 什么是不安全的状态?系统能按某种进程推进顺序( P1, P2, …, Pn),为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺序地完成。此时称 P1, P2, …, Pn 为安全序列。如果系统无法找到一个安全序列,则称系统处于不安全状态。

  其实第一和第二是预防死锁的方式,分别对应着的是破坏循环等待条件,和破坏不可剥夺条件。

  第一: 加锁顺序: 对所有的资源加上序号,确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生,比如有资源 A, B,规定所有的线程只能按照A–B的方式获取资源, 这样就不会发生 线持有A,请求B,线持有B请求A的死锁情况发生了

  第二: 获取锁的时候加一个超时时间,这也就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求,同时放弃掉自己已经成功获得的所有资源的锁,然后等待一段随机的时间再重试。这段随机的等待时间让其它线程有机会尝试获取相同的这些锁,并且让该应用在没有获得锁的时候可以继续运行。

  第三:死锁的提前检测, 很出名的就是银行家算法。 每当一个线程获得了锁,会存储在线程和锁相关的数据结构中(map、graph等等)将其记下。除此之外,每当有线程请求锁,也需要记录在这个数据结构中,当一个线程请求锁失败时,这个线程可以遍历锁的关系图看看是否有死锁发生。

  思想: 当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配

  主要是通过设置某些外部条件去破坏死锁产生的四个必要条件中的一个或者几个。

  破坏互斥条件,一般不采用,因为资源的互斥性这个特性有时候是我们所需要的;

  破坏请求和保持条件:可以一次性为一个进程或者线程分配它所需要的全部资源,这样在后面就不会发起请求资源的情况,但是这样资源的效率利用率很低;

  破坏不可剥夺条件: 当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请,但是释放已获得的资源可能造成前一阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量;

  破坏循环等待条件: 可釆用顺序资源分配法。首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri的资源。

  MVCC(多版本控制系统)的实现(目的: 实现更好的并发,可以使得大部分的读操作不用加锁, 但是insert,delete,update是需要加锁的):

  在InnoDB中,会在每行数据后添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(即何时被删除)。 在实际操作中,存储的并不是时间,而是系统的版本号,每开启一个新事务,系统的版本号就会递增。

  通过MVCC,虽然每行记录都需要额外的存储空间,更多的行检查工作以及一些额外的维护工作,但可以减少锁的使用,大多数读操作都不用加锁,读数据操作很简单,性能很好,并且也能保证只会读取到符合标准的行,也只锁住必要行。

  MySQL中的读,和事务隔离级别中的读,是不一样的, 在REPEATABLE READ 级别中,通过MVCC机制,虽然让数据变得可重复读,但我们读到的数据可能是历史数据,是不及时的数据(存储在缓存等地方的数据),不是数据库当前的数据!这在一些对于数据的时效特别敏感的业务中,就很可能出问题。

  当前读:插入/更新/删除操作,属于当前读,处理的都是当前的数据,需要加锁。

  事务的隔离级别实际上都是定义了当前读的级别,MySQL为了减少锁处理(包括等待其它锁)的时间,提升并发能力,引入了快照读的概念,使得select不用加锁。而update、insert这些“当前读”,就需要另外的模块来解决了。(这是因为update、insert的时候肯定要读取数据库中的值来与当前事务要写入的值进行对比,看看在该事务所处理的数据在这一段时间内有没有被其他事务所操作(就是先读取数据库中数据的版本号与当前的版本号做检查))

  为了解决当前读中的幻读问题,MySQL事务使用了Next-Key锁。Next-Key锁是行锁和GAP(间隙锁)的合并 GAP(间隙锁)就是在两个数据行之间进行加锁,防止插入操作

  行锁防止别的事务修改或删除,解决了数据不可重复读的问题,GAP锁防止别的事务新增,行锁和GAP锁结合形成的的Next-Key锁共同解决了RR级别在读数据时的幻读问题

  Serializable级别使用的是悲观锁的理论, 读加共享锁,写加排他锁,读写互斥, 在Serializable这个级别,select语句还是会加锁的。

  数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。...博文来自:zxcodestudy

  1.什么是数据库事务1.1数据库事务是指作为单个逻辑工作单元执行的一系列操作(SQL语句)。这些操作要么全部执行,要么全部不执行。1.2通过ACID实现数据库事务模型1.2.1原子性(Atomicit...博文来自:huwenhu2007的专栏

  一、锁的含义乐观锁:顾名思义,对当前操作的数据保持一个乐观的态度,认为不会有其他事务操作修改当前的数据记录。只有在提交事...博文来自:Yoga0301的博客

  一、活锁活锁的情况:如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待;T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待;然后T4又请求封锁R,当T3释放了...博文来自:lxw的博客

  问题描述未签收的订单十五天之后自动签收:总共2个步骤:step1在乐购系统中批量更新未签收订单的状态,step2:通过RPC...博文来自:I_will_try的博客

  并发控制:事务和锁的存在都是为了更好的解决并发访问造成的数据不一致性的的问题乐观锁和悲观锁都是为了解决并发控制问题,乐观锁可以认为是一种在最后提交的时候检测冲突的手段,而悲观锁则是一种避免冲突的手段。...博文来自:请叫我王老魔

  一、先介绍一下手头的项目情况:     1、同时操作4个表,分别是25w、55W(CRUD操作),以及另外另个副表也是25w、55w(只写)。     2、应该也是50-100人左右同时操作。 二、这...博文来自:架构的艺术

  背景及现象         线上生产环境在某些时候经常性的出现数据库操作死锁,导致业务人员无法进行操作。经过DBA的分析,是某一张表的insert操作和delete操作发生了死锁。简单介绍下数据库的情...博文来自:yuyuyuyu5200的博客

  阻塞和死锁是数据库应用的设计问题。从根本上来说,因为关系型数据库事务的原因,阻塞是必须的。阻塞和死锁产生的三大因素:连接持有锁的时间过长、锁的粒度较大、数目过多。锁产生的背景:事务。因为事务的ACID...博文来自:lemon627497658的博客

  用MySQL客户端模拟并发事务操作数据时,如下表按照时间的先后顺序执行命令,会导致死锁。数据库数据如下select*froma;+----+id+----+3+----+8+----+1...博文来自:p7+的博客

  使用navicat测试学习:首先使用setautocommit=0;(取消自动提交,则当执行语句commit或者rollback执行提交事务或者回滚) 在打开一个执行update查询正在执行的事务:S...博文来自:yehui186之中期回顾

  事务(进程ID)与另一个进程已被死锁在lock资源上,且该事务已被选作死锁牺牲品。请重新运行该事务其实所有的死锁最深层的原因就是一个:资源竞争表现一:一个用户A访问表A(锁住了表A),然后又访问表B另...博文来自:

  讲一些题外话,没兴趣的可直接跳过.首先非常感觉上家公司常常被骂的狗血淋头但又觉得十分可爱的暗灭大人.  教给我的太多太多,但最重要的也是和这篇文章有关联的就是让我明白该如何去思考问题,定位问题,解决问...博文来自:的博客

  多事务运行并发问题在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分类...博文来自:总结沉淀

  PostgreSQL通过使用称为MVCC(多版本并发控制)的方法实现并发控制。在此方法中,当正在更新项目时,更改将不会覆盖原始数据,而是将创建项目的新版本(带有更改)。因此,我们将存储多个版本的项目。...博文来自:PG_HGDB的博客

  今天之前的同事问我,之前我负责的系统出现了MySQL异常,但是事务却没有回滚,事务前半部分执行的SQL在数据库能看到,日志信息如下org.springframework.dao.DeadlockLos...博文来自:jtjs1989的专栏

  一.事务 数据库必须具备的四个特性1:原子性:事务包含的所有操作要么全部成功,要么全部失败回滚;成功必须要完全应用到数据库,失败则不能对数据库产生影响;2:一致性:事务执行前和执行后必须处于一致性状态...博文来自:JayVergil的博客

  解决mysql事务未提交导致死锁报错:        当sessionA尝试修改B表数据,因为sessionB当前为锁定状态,而且sessionB对B表中数据具有锁定状态中,则出现死锁。session...博文来自:许恒的博客

  数据库死锁原因及解决办法死锁(Deadlock)所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产...博文来自:firefly_2002的专栏

  环境Mysql5.6Innodb1.起因我们有个需要事物的业务场景,上线之初一直运行正常,可是在晚上高峰的时候一直会有逻辑错误的问题,刚开始绝的是逻辑有问题。在阿里RDS后台发现出现大量的锁,主表的某...博文来自:bugall的专栏

  线程A需要资源X,而线程B需要资源Y,而双方都掌握有对方所要的资源,这种情况称为死锁(deadlock),或死亡拥抱(thedeadlyembrace)。在并发程序设计中,死锁(deadlock)是一...博文来自:墨者侠客

  数据库的事务功能是所有开发人员都会遇到和使用的,当初开发windows基于ado接口,unix下基于OCI接口,都需要直接写sql和自己控制事务,随着mybatis等更加功能丰富的封装接口出现,sql...博文来自:charthyf的博客

  1、数据库事务1.1数据库事务(DatabaseTransaction),是指作为单个逻辑工作单元执行的一系列操作。1.2事务的4个特性(ACID):(1)原子性(atomic)(atomicity)...博文来自:单炒饭

  1.可串行性并行操作对并行事务的操作的调度是随机的,不同的调度可能产生不同的结果。在这些不同的调度中,肯定有些调度的结果是正确的,究竟哪些调度是正确的呢?若每个事务的基本操作都串连在一起,没有...博文来自:Mechanical Sympathy.

  因为服务器端没有返回值,造成数据库事物一直没有提交而update的时候总是lock。蠢死我算了……...博文来自:wanglt311的博客

  问题定位和排除思路如下:1,根据日志定位到报错的地方,确定数据库的查询处报错。可以确定该故障是数据库的死锁问题。2. 被选择结束的该事务全程都是只有查询.那另一个事务肯定含有写操作。如果两个事务都是查...博文来自:yinni11的博客

  事务ACID特性:原子性一致性隔离性持续性冲突可串行是可串行性的充分条件,不是冲突可串行也可能是可串行的两段锁协议(2PL)1、可串行性:并行操作对并行事务的操作的调度事随机的,不同的调度可能产生不同...博文来自:的博客

  1.若事务T对数据R已经加X锁,则其他事务对数据R()不能加任何锁2.并发操作会带来哪些数据不一致性()丢失修改、不可重复读、脏读3.设事务T1和T2,对数据库中的数据A进行操作,可能有如下几种情况,...博文来自:Nothing replaces hard work.

  Spring事务首先来看事务的四个特性:原子性事务的执行将事务内所做的操作看做一个整体,要么全部执行,要么全部不执行.隔离性(可能导致死锁)简单来说,两个事务在同时进行更新时,一个事务在更新,另一个事...博文来自:lvgo

  1问题描述   支付平台上线之后在payorderinsert的时候时不时会报deadlockdetected的错误日志,在流量高峰的时候更易发生,在流量不是很高的时候也有发生。   追查发现这种情况...博文来自:°三度微凉的博客

  如何解决死锁通过执行计划可以看出,在查找需要更新的数据时使用的是索引扫描,比较耗费性能,这样就造成锁定资源时间过长,增加了语句并发执行时产生死锁的概率。处理方式:1.在表上建立一个聚集索引。2.对语句...博文来自:qi琪的专栏

  笔者所在公司最近上了一套系统,系统使用中间件连接Oracle数据库,使用一段时间之后系统就会停止响应。发现问题在于2点:1.中间件有线程执行了Delete语句之后,一直处于等待状态,没有COMMIT提...博文来自:轩轩爱吃肉的技术小博客

  前言:        由于网站访问压力的问题,综合分析各种因素后结合实际情况,采用数据库读写分离模式来解决当前问题。实际方案中采用“事务发布”模式实现主数据库和只读数据库的同步,其中:发布服务...博文来自:weixin_33700350的博客

  今天有个开发人员,一天之内,产生了好几次记录被锁没有释放,大致情况是这样的:应用中有个定时:selectxxx forupdate,2分钟执行一次。执行过程中有commi;这个job是单线程的,照理说...博文来自:fanzhenhua的专栏

  引言近来做省一级计算机一级考试系统的时候,学生端进行大批量判分的时候,出现了这样的问题(事务(进程ID262)与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品。请重新运行该事务。):这个就是我们在...博文来自:邱慕夏 没有比脚更长的路,没有比人更高的山

  可参考:数据库中死锁那些事儿死锁及死锁检测(四)博文来自:zehuawong的博客

  [b]问题场景[/b]每次节假日之前,公司的业务人员要通过我们开发的短信平台发送大量短信,导致数据库发生死锁。直接结果就是部分更新状态的操作对应的事务回滚,导致月底和移动公司对不平账。[b]获取死锁详...博文来自:yuyuncheng的专栏

  数据库聚集索引与非聚集索引根本区别在于:表记录的排列顺序和索引的排列顺序是否一致 然后插入一条数据 给A字段创建聚集索引 删除聚集索引创建非聚集索引然后插入数据 效果对比:循环插入100条数据执行计划...博文来自:Todd Li的博客

  最近很多人问,如何将内网的摄像机流媒体数据发布到公网,如果用公网与局域网间的端口映射方式太过麻烦,一个摄像机要做一组映射,而且不是每一个局域网都是有固定ip地址,即使外网主机配置好了每一个摄像机的映射...博文来自:Babosa的专栏

  一、图像内插-最近邻内插法 1、数学原理      当一幅二维数字图像从源图像N*M被放为(j*N) * (k*M)目标图像是,参照数学斜率计算公式      必然有: (X1 – Xmin)/...博文来自:清风似水流的专栏

  帐号相关流程注册范围 企业 政府 媒体 其他组织换句话讲就是不让个人开发者注册。 :)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账...博文来自:小雨同学的技术博客

  本文介绍了如何在超图桌面平台通过倾斜摄影模型提取DSM、DOM数据。博文来自:SuperMap技术控

  LCD RGB 控制技术讲解 — 时钟篇(上)个人笔记,欢迎转载,请注明出处,共同分享 共同进步 博文来自:人有三样东西是无法隐瞒的,咳嗽,穷困和爱,你想隐瞒越欲盖弥彰

  mybatis简单的CURD就不用多说了,网上相关博客文档一大堆。分析一下Mybatis里面的collection聚集查询。 假设一个班级有多名学生为例,通过班级号查询出该班级的信息,和班级里面的所...博文来自:minpann的博客

http://funnyland.net/fengsuolidu/523.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有