MySQL数据库死锁进程分析(选择更新)

MySQL数据库死锁进程分析(选择更新)
最近的一个业务需要,很多机器需要一个表,从MySQL查询数据和后续的业务逻辑,为了防止多台机器同时获得相同的数据,每台机器都需要在锁定段数据中访问数据,确保机器不接受相同的数据。
我们的MySQL存储引擎InnoDB,支持行级锁。同时要解决数据的方法有很多,为了更简单,无需增加其他表和服务的条件下,我们考虑的选择…对于更新,此X锁定数据查询,其他数据表没有锁定,其他业务逻辑或操作。
当这样的服务器,如选择…更新限制为,其他服务器执行相同的SQL语句,它们会自动等待释放锁。在等待释放以前的服务器锁之后,服务器将能够查询下一个30个数据。如果需要更智能的话,Oracle支持更新跳过锁,跳过锁区,这样接下来的30个未立即锁定的记录就不会等待查询了。
接下来,说下一个MySQL更新所造成的死锁。
经过分析,MySQL InnoDB存储引擎锁线是可行的,但它是内部锁指数,根据那里的条件和选择的值是唯一的初级或不确定如何锁定主键索引,如唯一的主键,锁的关键指标,如果只有非主键,锁是非主键索引,如果主键非主键内部将与锁的顺序一致。但如何做同样的选择。更新语句是否死亡在同一SQL语句中,查询条件和结果序列都是一致的,不会导致主键索引锁定,等待锁成为非主键索引,另一个锁定非主键索引,等待主键索引引起的死锁。
在分析结束时,我们发现了UPDATE语句和来自另一个更新非SELECT数据的SQL语句引起的死锁。
例如,有60个数据,选择、更新、查询31-60数据,更新数据更新1-10,根据对InnoDB存储引擎的行锁的原理,它不应该导致没有同伴的锁使彼此等待。它开始认为行锁是锁在一个大的数据量和数据块将被锁定。一个段的数据被锁定,但经过大量的数据测试,发现整个表是锁着的,但它不是。
下面举几个例子。
数据从ID = 400000的数据开始,无论是成功和时间字段都是0,现在如果400000数据就是成功执行以下SQL 1。
- 1:
设置自动提交= 0;
开始;
SELECT * FROM表在时间<1,成功= 0阶的ID ASC限制;
承诺;
- 2:
更新表一套成功= 0,ID = 400000;
第一个SQL语句提交,第二的SQL语句将不得不等待,所以第二SQL语句修改为0成功的成功,为0锁定索引数据的非主键索引值,二SQL语句进行数据更新被锁定的行。
然后执行以下SQL语句

- 1:
设置自动提交= 0;
开始;
SELECT * FROM表在时间<1,成功= 0阶的ID ASC限制;
承诺;
- 2:
更新表一套成功= 2,ID = 400000;
第二的SQL语句将被执行。因为成功= 2的索引段没有锁。
上面的例子知道锁索引部分更容易理解,下面是一个小小的奇迹:
首先,修改ID = 400000的数据,1的时间,成功= 0,然后执行一次查询:
- 1:
设置自动提交= 0;
开始;
更新ctripticketchangeresultdata一套成功= 1,ID = 400000;
承诺;
- 2:
SELECT * FROM表在时间<1,成功= 0阶的ID ASC限制;

第一个SQL未提交。它只锁40000行,第二SQL按原因执行。根据原因,它只能从400001查询30条记录,但第二条SQL语句将阻塞并等待。
原因是第一个SQL语句没有承诺,没有回滚,那么它是第一个锁定的关键指标,非主要指标锁定成功,第二SQL语句作为衡量成功的价值领域在哪里,因为之前400000成功是0的数据,现在更新到1是不确定的因此,可以回滚,SQL2需要等待确定是否成功已经修改400000数据。SQL2的SQL语句,因为对时间<1的判断,实际400000的记录是不满意的,但原理锁的指标,所以SQL2语句将被封锁。
因此,根据业务情况,我们可以取消该SQL2语句的成功条件,和时间查询的条件是从时间<1改时间= 0,所以我们不能阻止和直接查询。
在分析了范围查询引起锁的影响,时间是没有间隙锁问题。它应该用作条件。所有的查找范围从零排将被锁定。例如,更新400000将受阻,但400031的更新将不会被堵塞。
我们项目的僵局是原则。SQL语句首先锁定主键索引,然后锁定非主键索引。另一个SQL语句锁定非主键索引,主键索引然后锁。虽然两SQL语句期待锁不同的数据行,如果两个SQL语句查询或更新的状态或结果场如果他们有相同的列,他们会互相等待对方的锁,和2的SQL语句导致死锁。
InnoDB存储引擎下的锁分析的个人总结可能存在问题:
1,在更新或查询更新时,它将开始判断是否在每个字段中有一个锁。如果有一个锁,它会等待,因为如果有一个锁,字段的值是不确定的,它只能等待提交或回滚来在查询之前确认数据。
2,除了按顺序,因为以前的数据可能被锁定,但查询的范围从后面可以查询。
3、限制也有关,例如,限制,以从第二十记录数据30行,但如果第一列数据是锁着的,因为它是不确定的回滚或提交,它也将等待锁。
ps:MySQL使用杀命令来解决死锁问题,并杀死正在执行的SQL语句。

当使用MySQL运行某些语句时,死锁将由太多的数据引起,并且没有被反映出来。此时,您需要杀死一个消耗资源的查询语句,而命令的语法格式如下所示:

复制代码代码如下所示:

杀了{ } thread_id |连接查询
每一个连接mysqld运行在一个单独的线程。你可以使用SHOW PROCESSLIST语句看哪个线程正在运行和终止线程使用杀thread_id声明。

杀允许选定的连接或查询修饰符:杀死连接是一样的杀,不包含修饰符:终止一个连接与一个给定的查询,thread_id.kill终止当前正在执行的连接,但它会保持连接的原。

如果你有过程的权限,你可以看看所有的线程。如果你有超级管理员权限,你可以终止所有线程和报表。否则,你只能查看和终止自己的线程和报表。您还可以使用mysqladmin PROCESSLIST和mysqladmin杀命令来检查和终止线程。

首先登录到MySQL,然后使用SHOW PROCESSLIST;看看各个线程在当前MySQL的状态。
MySQL >显示列表;
+ + + + ------ ------ ---------------------- ---------------- + + + + --------------------- ----------- --------- -------
ID用户主机| | | | DB命令状态| | | |信息
+ + + + ------ ------ ---------------------- ---------------- + + + + --------------------- ----------- --------- -------
7028根| | UCAP devgroup:53396平台的睡眠| | | | 19553 | |空
8352根| | UCAP devgroup:54794平台的睡眠| | | | 4245 | |空
8353根| | UCAP devgroup:54795平台的睡眠| | | | 3 | |空
8358根| | UCAP devgroup:62605平台查询| | | | 4156更新的更新t_shop集| | |
上面显示了当前正在执行的SQL语句列表,以查找最大消耗资源的语句的相应ID。

然后,运行命令,命令格式如下所示:

杀了我;

-例子:

杀8358
杀了它。

tag:进程数据库死锁选择电脑软件

相关内容