一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看:
看你的mysql现在已提供什么存储引擎:
mysql show engines;
看你的mysql当前默认的存储引擎:
mysql show variables like \\'%storage_engine%\\';
你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):
mysql show create table 表名;
mysql 连接线程被阻塞怎么解决
Mysql数据库的一个表任何操作都阻塞,
看会不会有一些语句卡住了,锁表,新语句执行不了 show full processlist,看看是否有运行太久的语句
查询死锁进程
采用如下存储过程来查询数据中当前造成死锁的进程.
drop procedure sp_who_lock
go
CREATE procedure sp_who_lock
as
begin
declare @spid int
declare @blk int
declare @count int
declare @index int
declare @lock tinyint
set @lock=0
create table #temp_who_lock
(
id int identity(1,1),
spid int,
blk int
)
if @@error0 return @@error
insert into #temp_who_lock(spid,blk)
select 0 ,blocked
from (select * from master..sysprocesses where blocked0)a
where not exists(select * from master..sysprocesses where a.blocked =spid and blocked0)
union select spid,blocked from master..sysprocesses where blocked0
select @count=count(*),@index=1 from #temp_who_lock
if @count=0
select '没有阻塞和死锁信息'
return 0
end
set @lock=1
select '引起数据库死锁的是: '◆ CAST(@spid AS VARCHAR(10)) ◆ '进程号,其执行的SQL语法如下'
select @spid, @blk
dbcc inputbuffer(@spid)
dbcc inputbuffer(@blk)
if @lock=0
set @index=1
if @spid=0
select '引起阻塞的是:'◆cast(@blk as varchar(10))◆ '进程号,其执行的SQL语法如下'
else
select '进程号SPID:'◆ CAST(@spid AS VARCHAR(10))◆ '被' ◆ '进程号SPID:'◆ CAST(@blk AS VARCHAR(10)) ◆'阻塞,其当前进程执行的SQL语法如下'
drop table #temp_who_lock
GO
--执行该存储过程
exec sp_who_lock
补充:
第一段:产生死锁的原因
在SQL Server中,阻塞更多的是产生于实现并发之间的隔离性.为了使得并发连接所做的操作之间的影响到达某一期望值而对资源人为的进行加锁(锁本质其实可以看作是一个标志位).当一个连接对特定的资源进行操作时,另一个连接同时对同样的资源进行操作就会被阻塞,阻塞是死锁产生的必要条件.
第二段:如何避免死锁
①使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务;
第三段:处理死锁
①.、最简单的处理死锁的方法就是重启服务.
根据第二步查询到的死锁进行,大致分析造成死锁的原因,并通过如下语句释放该死锁进程
kill pid --pid为查询出来的死锁进程号
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_killspid]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_killspid]
create proc sp_killspid
declare #tb cursor for
open #tb
fetch next from #tb into @spid
while @@fetch_status=0
close #tb
deallocate #tb
--使用方法,"db_name"为处理的数据库名称
exec sp_killspid 'db_name'
通过下面的查询,?来查询当前数据库,?有哪些事务,都锁定哪些资源.
SELECT
trx_id?AS?◆事务ID◆,
trx_state?AS?◆事务状态◆,
trx_requested_lock_id?AS?◆事务需要等待的资源◆,
trx_wait_startedAS?◆事务开始等待时间◆,
trx_tables_in_use?AS?◆事务使用表◆,
trx_tables_locked?AS?◆事务拥有锁◆,
trx_rows_locked?AS?◆事务锁定行◆,
trx_rows_modified?AS?◆事务更改行◆
FROM
information_schema.innodb_trx?;
lock_idAS◆锁ID◆,
lock_trx_id?AS◆拥有锁的事务ID◆,
lock_mode?AS◆锁模式◆,
lock_type?AS◆锁类型◆,
lock_table?AS◆被锁的表◆,
lock_index?AS◆被锁的索引◆,
lock_space?AS◆被锁的表空间号◆,
lock_page?AS◆被锁的页号◆,
lock_rec?AS◆被锁的记录号◆,
lock_data?AS◆被锁的数据◆
information_schema.innodb_locks;
requesting_trx_id?AS?◆请求锁的事务ID◆,
requested_lock_id?AS?◆请求锁的锁ID◆,
blocking_trx_id??AS?◆当前拥有锁的事务ID◆,
blocking_lock_id?AS?◆当前拥有锁的锁ID◆
innodb_lock_waits;
以上就是土嘎嘎小编为大家整理的mysql怎么捕捉阻塞的相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!