
脚本之家小编推荐的一个方法:到服务里面重启下sqlserver服务即可。
问题一描述:SQL
Server数据库备份还原后,在数据库名称后会出现“受限制访问”字样
问题二描述:在对SQL
Server数据库进行还原时,提示:System.Data.SqlClient.SqlError:因为数据库正在使用,所以无法获得对数据库的独占访问权。(Microsoft.SqlServer.Smo)。出现此问题的原因是在还原数据库时,有其他用户正在使用数据库。还原数据库要求数据库工作在单用户模式。通常就是DBA在 *** 作时,不允许其他用户连接数据库。
问题一解决办法:
右键点击数据库
->
属性
->
选项
->
状态
->
限制访问
->
选择Multiple
->
确定。
问题二解决办法:
方法一(最方便):右键点击数据库
->
属性
->
选项
->
状态
->
限制访问
->
选择Single->
确定。然后还原。
方法二(最直接):断开数据库连接
方法三(最暴力):注销/重启数据库服务器
方法四(最麻烦):写代码修改数据库相关属性,虽然麻烦,有的时候还是要用到,那就用到的时候再研究。
①先切换数据库到master数据库。执行语句
select
*
from
master..sysprocesses
where
dbid=db_id(
'数据库名称')
②然后逐步运行语句
exec
kill
spid(上一步结果集中的数据),
问题就解决了。哈哈
今天在还原数据库的时候,提示"因为数据库正在使用,所以无法获得对数据库的独占访问权",无论我是重启数据库,还是重启计算机,都不能解决问题,多番尝试后,终于解决了该问题。现将引发该问题的原因与解决方案写出来,有不对的地方欢迎大家提出来。
引发原因:是因为我在还原数据库的时候,还有其他的用户正在使用数据库,所以就会出现以上提示。
解决方法:
1,设置数据库在单用户模式下工作。
设置方法:在需要还原的数据库上右击,在右键菜单命令上选择"属性"-
>"选项"-
>"状态"-
>"限制访问"-
>"Single"。这是SQLSERVER2005的菜单命令,其它版本请自己查找。
2,利用SQL语句,杀死正在使用该数据库的所有进程,自己以前在做一个SQL
SERVER *** 作小工具的时候有写过该功能的SQL,贴出来供大家参考:
复制代码
代码如下:
declare
@dbname
varchar(50)
set
@dbname='数据库名称'
declare
@sql
varchar(50)
declare
cs_result
cursor
local
for
select
'kill
'+cast(spid
as
varchar(50))
from
sys.sysprocesses
where
db_name(dbid)=@dbname
open
cs_result
fetch
next
from
cs_result
into
@sql
while
@@fetch_status=0
begin
execute(@sql)
fetch
next
from
cs_result
into
@sql
end
close
cs_result
deallocate
cs_result
该SQL语句利用游标循环所有正在使用该数据库的进程,并通过kill命令杀死进程。
3,利用SQL语句,断开所有用户链接,并回滚所有事务,具体SQL语句如下:
复制代码
代码如下:
ALTER
DATABASE
[数据库名称]
SET
OFFLINE
WITH
ROLLBACK
IMMEDIATE
注意:在使用方法2与3时,不要在需要的还原的数据库下执行,建议在master数据库下面执行。
应该有其他用户连接数据库,所以导致无法还原,建议的处理方法:1.先用sp_who语句,检查那些连接连著此数据库。
2.根据前一步查到的id号,通过kill语句去删除连接。
sql多用户访问数据库其实就是事务并发,会引起如下问题:1、脏读:一个事务读取到了另外一个事务没有提交的数据
事务1:更新一条数据
事务2:读取事务1更新的记录
事务1:调用commit进行提交
此时事务2读取到的数据是保存在数据库内存中的数据,称为脏读。
读到的数据为脏数据
详细解释:
脏读就是指:当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,
另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个
事务读到的这个数据是脏数据,依据脏数据所做的 *** 作可能是不正确的。
2、不可重复读:在同一事务中,两次读取同一数据,得到内容不同
事务1:查询一条记录
事务2:更新事务1查询的记录
事务2:调用commit进行提交
事务1:再次查询上次的记录
此时事务1对同一数据查询了两次,可得到的内容不同,称为不可重复读。
3、幻读:同一事务中,用同样的 *** 作读取两次,得到的记录数不相同
事务1:查询表中所有记录
事务2:插入一条记录
事务2:调用commit进行提交
事务1:再次查询表中所有记录
此时事务1两次查询到的记录是不一样的,称为幻读
详细解释:
幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,
这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表
中插入一行新数据。那么,以后就会发生 *** 作第一个事务的用户发现表中还有没有修改的数据行,
就好象发生了幻觉一样。
处理以上隔离级别的问题,采用如下方是:
事务隔离五种级别:
TRANSACTION_NONE 不使用事务。
TRANSACTION_READ_UNCOMMITTED 允许脏读。
TRANSACTION_READ_COMMITTED 防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别
TRANSACTION_REPEATABLE_READ 可以防止脏读和不可重复读,
TRANSACTION_SERIALIZABLE 可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率
以上的五个事务隔离级别都是在Connection接口中定义的静态常量,
使用setTransactionIsolation(int level) 方法可以设置事务隔离级别。
如:con.setTransactionIsolation(Connection.REPEATABLE_READ)
注意:事务的隔离级别受到数据库的限制,不同的数据库支持的的隔离级别不一定相同
1 脏读:修改时加排他锁,直到事务提交后才释放,读取时加共享锁,读取完释放事务1读取数据时加上共享锁后(这 样在事务1读取数据的过程中,其他事务就不会修改该数据),不允许任何事物 *** 作该数据,只能读取,之后1如果有更新 *** 作,那么会转换为排他锁,其他事务更 无权参与进来读写,这样就防止了脏读问题。
但是当事务1读取数据过程中,有可能其他事务也读取了该数据,读取完毕后共享锁释放,此时事务1修改数据,修改 完毕提交事务,其他事务再次读取数据时候发现数据不一致,就会出现不可重复读问题,所以这样不能够避免不可重复读问题。
2 不可重复读:读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题
3 幻读问题:采用的是范围锁RangeS RangeS_S模式,锁定检索范围为只读,这样就避免了幻影读问题。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)