Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

[5分]SQL服务器的表常被锁住,怎么办?

菜鸟  发表于:2012-12-27 12:19:00  
复制

 各位老师,保存数据时,有时表被锁定,保存不了,要重新服务器才行,有没有办法解决呢。

有的保存时有更新,也有增加,有时只运行完更新,增加就出错了,导致库存不准确,很麻烦

如运行:

DoCmd.RunSQL " INSERT INTO tbl_Wip_Wo_Dep_Stock ( WoCode, Dep, DepDate)" _
               & " SELECT Temp_tbl_Wip_Wo_Dep_Detail.WoCode, '" & Me![ToDep] & "', #" & Me![TrDate] & "#" _
               & " FROM Temp_tbl_Wip_Wo_Dep_Detail;"

请各位老师指教一下解决方法

 

 

 

Top
dbaseIIIer 发表于:2012-12-28 23:04:29

菜鸟兄,请你使用 事务来写入。


我看你的 SQL语句,我就觉得有点问题,


你的语句前面应该还有  Trx 要写入,Wip 存入某个部门,

对于你这个 WIP 的 ShopFloorControl 模块,是需要很大量的数据读写的,

你把几个 SQL语句 分开几个 Docmd 来执行,一定死得人多的!


请考虑你的能力来决定改成:

1. 一句 Docmd.RunSql 来运行所有的 写入;

2. 使用SQL的事务 处理,  在批量SQL前  使用 BEGINTRANS  后面使用 COMMIT 来 写入,出错就用 ROLLBACK来回滚;

3. 你这一些列的 事务,最好还是用 Stored Procedure 来运行  ,


减少 网络流量(少了网络碰撞机会),少了SQL内的锁表状态,少了SQL的登入事务,你的数据库出错的机会就少了!


还有,当你SQL有死锁(就是有事务锁上主表,不停尝试锁上从表;而同时另外一个事务锁上了从表,不停的尝试锁上主表)的时候,

其实是不需要重启服务器的,你可以采取以下任何一种轻便的手法:

1. 重启服务

2. 删掉所有事务

3. 删掉锁上的事务


甚至你可以写一段存储过程去 停掉所有事务的。


不过你还是首先弄好你的程序要有事务回滚,至少你的数据不会出错!




菜鸟 发表于:2013-01-03 11:01:59
老师,程序事务回滚怎么搞呀!能否具体举个例子或给个例子参考一下!,这个问题让我很头痛!非常感谢!

dbaseIIIer 发表于:2013-01-04 02:25:15

BEGIN TRY 
BEGIN TRAN 
-- 在A表中插入数据 
INSERT INTO [dbo].[A]  ( [A_Name] , [A_Remark] ) VALUES ( ‘xxx' , 'yyy' ) 
-- 在B表中插入数据 
INSERT INTO [dbo].[B] ( [A_ID] , [B_Name] , [B_Remark] ) VALUES ( @@IDENTITY, 'xxxxxx' , 'zzzzzzzzzzzz' ) 
COMMIT TRAN 
END TRY 
BEGIN CATCH 
ROLLBACK TRAN 
INSERT INTO [dbo].[ErrorLog] ( [EL_Procedure]  , [EL_OperateTime] ) -- 报异常时间 
VALUES ( 'TEST_PROC' , CONVERT(DATETIME,GETDATE(),20) ) 
END CATCH 


这是一次性 发送的SQL语句, 插入 两个表的记录,

当中有失败的 就会跳到 Begin catch 里面,然后 执行 Rollback Tran 不做任何的改动,

没有错误的话,会知道 最后 Commit Tran 写入两表的数据,

第二个表 的 @@IDENTITY 是SQL的变量,是最后一个插入的 自动编号。


最后那个 insert 是记录出错情况的,要不要这个表和这个记录就随便你!



红尘如烟 发表于:2013-01-11 08:39:27

你这种情况可能的原因不只一种,你可以先尝试将代码改成下面的ADO事务方式,如果仍然存在问题,就说明是服务器上的某个表有损坏,造成的异常,这样就需要先把数据导出到一个Access数据库文件,然后在服务器上重新建表,再把数据导回去。


Private Sub btnSave_Click()
    On Error GoTo ErrorHandler
    Dim strSQL        As String
    Dim cnn           As ADODB.Connection
    Dim rst           As ADODB.Recordset
    Dim rstTmp        As DAO.Recordset
    Dim blnTransBegin As Boolean
   
    '打开连接
    Set cnn = New ADODB.Connection
    cnn.Open "Provider=SQLOLEDB;Data Source=192.168.1.1;Database=我的数据库", "用户名", "密码"
    '启动事务
    cnn.BeginTrans
    blnTransBegin = True
   
    '打开到后台数据库指定的表的记录集
    Set rst = New ADODB.Recordset
    strSQL = "SELECT * FROM tbl_Wip_Wo_Dep_Stock"
    rst.Open strSQL, cnn, adLockOptimistic, adLockOptimistic
   
    '打开临时表记录集
    Set rstTmp = CurrentDb.OpenRecordset("Temp_tbl_Wip_Wo_Dep_Detail", , dbReadOnly)
   
    '循环临时表记录集中的每条记录,添加到后台数据库的表中
    Do Until rstTmp.EOF
        rst.AddNew
        rst!WoCode = rstTmp!WoCode
        rst!Dep = Me![ToDep]
        rst!DepDate = Me![TrDate]
        rst.Update
        rstTmp.MoveNext
    Loop
    rst.Close       '关闭记录集
    rstTmp.Close    '关闭临时表
    cnn.CommitTrans '提交事务
   
    MsgBoxEx "保存成功!", vbInformation
   
ExitHere:
    Set rst = Nothing
    Set rstTmp = Nothing
    Set cnn = Nothing
    Exit Sub
   
ErrorHandler:
    '出错时如果已启动事务,则回滚撤销
    If blnTransBegin Then
        cnn.RollbackTrans
        blnTransBegin = False
    End If
    MsgBox Err.Description, vbCritical
    Resume ExitHere
End Sub

 



总记录:4篇  页次:1/1 9 1 :