SQL Server数据库表锁定原理以及如何解除锁定

SQL Server数据库表锁定原理以及如何解除锁定,第1张

12 事务的ACID原则13 锁是关系数据库很重要的一部分, 数据库必须有锁的机制来确保数据的完整和一致性 131 SQL Server中可以锁定的资源:132 锁的粒度:133 锁的升级: 锁的升级门限以及锁升级是由系统自动来确定的,不需要用户设置 134 锁的类型: (1) 共享锁: 共享锁用于所有的只读数据 *** 作 (2) 修改锁: 修改锁在修改 *** 作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象 (3) 独占锁: 独占锁是为修改数据而保留的。它所锁定的资源,其他事务不能读取也不能修改。独占锁不能和其他锁兼容。 (4) 架构锁 结构锁分为结构修改锁(Sch-M)和结构稳定锁(Sch-S)。执行表定义语言 *** 作时,SQL Server采用Sch-M锁,编译查询时,SQL Server采用Sch-S锁。 (5) 意向锁 意向锁说明SQL Server有在资源的低层获得共享锁或独占锁的意向。 (6) 批量修改锁 批量复制数据时使用批量修改锁 134 SQL Server锁类型 (1) HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁。 (2) NOLOCK:不添加共享锁和排它锁,当这个选项生效后,可能读到未提交读的数据或“脏数据”,这个选项仅仅应用于SELECT语句。 (3) PAGLOCK:指定添加页锁(否则通常可能添加表锁)。 (4) READCOMMITTED用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上 *** 作。 (5) READPAST: 跳过已经加锁的数据行,这个选项将使事务读取数据时跳过那些已经被其他事务锁定的数据行,而不是阻塞直到其他事务释放锁, READPAST仅仅应用于READ COMMITTED隔离性级别下事务 *** 作中的SELECT语句 *** 作。 (6) READUNCOMMITTED:等同于NOLOCK。 (7) REPEATABLEREAD:设置事务为可重复读隔离性级别。 (8) ROWLOCK:使用行级锁,而不使用粒度更粗的页级锁和表级锁。

楼主 可以试试下面的方法:

清空日志

  DUMP TRANSACTION 库名

WITH

NO_LOG 

2截断事务日志:

  BACKUP LOG 数据库名 WITH

NO_LOG

3收缩数据库文件

  数据库名--右击--任务--收缩--文件

    --文件类型选择日志--收缩 *** 作选择第二个 将文件收缩到0 ,确定就可以了

4 也可以用SQL语句来完成

  --收缩数据库

  DBCC SHRINKDATABASE(客户资料)

  --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select from

sysfiles

  DBCC SHRINKFILE(1)

收缩的时候把恢复模式改为简单 否则收缩不了 

希望解决了楼主的问题

1、活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。处于活锁的实体是在不断的改变状态,活锁有可能自行解开。

2、死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

扩展资料:

死锁经常与正常阻塞混淆。事务请求被其他事务锁定的资源的锁时,发出请求的事务一直等到该锁被释放。默认情况下,除非设置了 LOCK_TIMEOUT,否则 SQL Server 事务不会超时。因为发出请求的事务未执行任何 *** 作来阻塞拥有锁的事务,所以该事务是被阻塞,而不是陷入了死锁。最后,拥有锁的事务将完成并释放锁,然后发出请求底事务将获取锁并继续执行。

参考资料来源:百度百科-死锁

参考资料来源:百度百科-活锁

导致

死锁

的主要原因是

SQL语句

里有for

update

导致。比如当你访问这个表时候

有人使用了for

update进行

数据修改

,那在你那里调试也好执行也好

都会导致无法返回结果

一直卡在那里。

对于MySQL来说,有三种锁的级别:页级、表级、行级

页级的典型代表引擎为BDB。

表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM。

行级的典型代表引擎为INNODB。

-我们实际应用中用的最多的就是行锁。

行级锁的优点如下:

1)、当很多连接分别进行不同的查询时减小LOCK状态。

2)、如果出现异常,可以减少数据的丢失。因为一次可以只回滚一行或者几行少量的数据。

行级锁的缺点如下:

1)、比页级锁和表级锁要占用更多的内存。

2)、进行查询时比页级锁和表级锁需要的I/O要多,所以我们经常把行级锁用在写 *** 作而不是读 *** 作。

3)、容易出现死锁。

对于写锁定如下:

1)、如果表没有加锁,那么对其加写锁定。

2)、否则,那么把请求放入写锁队列中。

对于读锁定如下:

1)、如果表没有加写锁,那么加一个读锁。

2)、否则,那么把请求放到读锁队列中。

当然我们可以分别用low_priority 以及high_priority在写和读 *** 作上来改变这些行为。

如果想要在一个表上做大量的 INSERT 和 SELECT *** 作,但是并行的插入却不可能时,可以将记录插入到临时表中,然后定期将临时表中的数据更新到实际的表里。可以用以下命令实现:

mysql> LOCK TABLES real_table WRITE, insert_table WRITE;

mysql> INSERT INTO real_table SELECT FROM insert_table;

mysql> TRUNCATE TABLE insert_table;

mysql> UNLOCK TABLES;

InnoDB 使用行级锁,BDB 使用页级锁。对于 InnoDB 和 BDB 存储引擎来说,是可能产生死锁的。这是因为 InnoDB 会自动捕获行锁,BDB 会在执行 SQL 语句时捕获页锁的,而不是在事务的开始就这么做。

行级锁的优点有:

在很多线程请求不同记录时减少冲突锁。

事务回滚时减少改变数据。

使长时间对单独的一行记录加锁成为可能。

行级锁的缺点有:

比页级锁和表级锁消耗更多的内存。

当在大量表中使用时,比页级锁和表级锁更慢,因为他需要请求更多的所资源。

当需要频繁对大部分数据做 GROUP BY *** 作或者需要频繁扫描整个表时,就明显的比其它锁更糟糕。

使用更高层的锁的话,就能更方便的支持各种不同的类型应用程序,因为这种锁的开销比行级锁小多了。

表级锁在下列几种情况下比页级锁和行级锁更优越:

很多 *** 作都是读表。

在严格条件的索引上读取和更新,当更新或者删除可以用单独的索引来读取得到时:

UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;

DELETE FROM tbl_name WHERE unique_key_col=key_value;

SELECT 和 INSERT 语句并发的执行,但是只有很少的 UPDATE 和 DELETE 语句。

很多的扫描表和对全表的 GROUP BY *** 作,但是没有任何写表。

表级锁和行级锁或页级锁之间的不同之处还在于:

将同时有一个写和多个读的地方做版本(例如在MySQL中的并发插入)。也就是说,数据库/表支持根据开始访问数据时间点的不同支持各种不同的试图。其它名有:时间行程,写复制,或者是按需复制。

复制代码 代码如下:

//执行SQL语句 锁掉stat_num表

$sql = "LOCK TABLES 表名 WRITE"; //表的WRITE锁定,阻塞其他所有mysql查询进程

mysql_query($sql);

//执行更新或写入 *** 作

$sql = "UPDATE stat_num SET `correct_num`=`correct_num`+1 WHERE stat_date='{$cur_date}'";

mysql_query($sql);

//当前请求的所有写 *** 作做完后,执行解锁sql语句

$sql = "UNLOCK TABLES";

mysql_query($sql);

您好:

提供一下数据库锁的概念。

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

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行 *** 作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新 *** 作。

锁是为了各个用户能够准确的 *** 作数据而存在的。

以上就是关于SQL Server数据库表锁定原理以及如何解除锁定全部的内容,包括:SQL Server数据库表锁定原理以及如何解除锁定、对SQL Server 2008数据库进行收缩时,会遇到死锁现象,如何解决。、活锁和死锁是什么意思啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9307392.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存