Foxtable(狐表)用户栏目专家坐堂 → 数据库事务-sql server隔离级别


  共有2016人关注过本帖树形打印复制链接

主题:数据库事务-sql server隔离级别

帅哥哟,离线,有人找我吗?
Grandraw
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:92 积分:1027 威望:0 精华:0 注册:2018/5/31 19:09:00
数据库事务-sql server隔离级别  发帖心情 Post By:2020/1/23 10:19:00 [只看该作者]

蓝老师好,

问题背景描述:

我开发的进销存系统中有很多表。Sql server data source.
在系统进行发货操作时需要时时查询并更新进销存系统库存总帐表 "InventoryTransactions"

发货操作中需要反复查询并逐行更新该表(一般都涉及很多行,如插入旧日期的记录,需要更新其后所有相关日期行的余额)。
我计划采用foxtable的数据库事务进行操作,在这个过程中我不希望其他进程对这个表进行任何的增删改查操作。

这个我看网上说需要修改Sql server的隔离级别。其默认的级别是READ COMMITTED,这个不能防止幻读。
我认为应该改成Serializable。

问题:
1. 不知道这个级别的更改是在foxtable代码里改还是其他地方改(如果其他地方该怎么改)?

2. 据说修改成 Serializable级别后会造成数据库并发能力降低,所以我希望每当发货操作时才提高这个级别,操作完成后立刻恢复到默认级别。
    并且该锁定只是针对特定的那个表即表"InventoryTransactions",  操作过程中若有其他进程对其他表的操作不受此处锁定的影响。具体不知该怎么做?

谢谢!




 

 回到顶部
帅哥哟,离线,有人找我吗?
Grandraw
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:92 积分:1027 威望:0 精华:0 注册:2018/5/31 19:09:00
  发帖心情 Post By:2020/1/23 10:36:00 [只看该作者]

还有一个问题:

错误捕获的问题,发现很多错误无法捕获。例如下面代码,在命令窗口测试无法捕获错误。
还有基本上所有sqlcommand的错误均无法捕获。我用的foxtable版本 2020-1-19

这样会影响数据库回滚操作。期待官方解决。

Try
    Ports.Add("哈哈哈COM20"
)
    Ports("哈哈哈COM20").Open
()
Catch ex As Exception
    MessageBox.Show("COM20已经被其它程序占用,无法打开!","提示",MessageBoxButtons.OK
)
End
Try


 回到顶部
帅哥哟,离线,有人找我吗?
Grandraw
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:92 积分:1027 威望:0 精华:0 注册:2018/5/31 19:09:00
  发帖心情 Post By:2020/1/23 11:23:00 [只看该作者]



动图

 回到顶部
帅哥哟,离线,有人找我吗?
Grandraw
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:92 积分:1027 威望:0 精华:0 注册:2018/5/31 19:09:00
  发帖心情 Post By:2020/1/23 11:24:00 [只看该作者]


图片点击可在新窗口打开查看此主题相关图片如下:test.gif
图片点击可在新窗口打开查看

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:105495 积分:536466 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/1/27 13:27:00 [只看该作者]

如果是一个事务中一次读,多次写,READ COMMITTED绝对足够了。

如果要在一个事务中多次读,多次写,可以使用SQL设置锁级别,参考:https://www.cnblogs.com/cnxcfeng/articles/1162341.html


 回到顶部
帅哥哟,离线,有人找我吗?
Grandraw
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:92 积分:1027 威望:0 精华:0 注册:2018/5/31 19:09:00
  发帖心情 Post By:2020/1/28 4:30:00 [只看该作者]

感谢蓝老师回答。还有疑问:

1)使用SQL设置锁级别:当我操作完成之后,是否需要恢复默认的锁级别呢?还是sql server可以自动恢复?

2)Try catch sql语句的错误的问题没有回答,详情如上。如果try语句抓不到sql语句的错误,那么数据库怎么回滚?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:105495 积分:536466 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/1/28 9:56:00 [只看该作者]

1、要自己写sql恢复
2、我测试没有问题,并不是所有的错误都try不到

图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看


 回到顶部