大量数据插入处理?

bj_leo_2000 2008-09-16 11:27:54
一次性要在多个库中的多个表插入大量数据,但现在有个问题。
原来的处理是为了保证所有数据的正确性,将所有全部插入操作完成后,一次性commit,如果在插入过程中有任何一点错误就rollback,将前面的操作全部回滚。但在多用户情况下就会造成阻塞,第二个进行插入操作的用户(以下简称B)只能在第一个进行插入操作的用户(以下简称A)完成操作后才能开始插入。
我看到网上说要解决多用户并发最后要在每次insert、update、delete后就commit或rollback,但一旦每次操作都commit或rollback,如果出了错误就没办法将前面的操作全部回滚。
有哪位大虾有经验给个处理思路,谢谢!
...全文
359 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wq8987 2008-10-06
  • 打赏
  • 举报
回复
为每个用户的操作写一个缓存,将这些数据先缓存到磁盘上!
如果没有出错就把缓存中的数据写入数据库,否则删除这个缓存中的数据!
wq8987 2008-10-06
  • 打赏
  • 举报
回复
为每个用户的操作写一个缓存,将这些数据先缓存到磁盘上!
如果没有出错就把缓存中的数据写入数据库,否则删除这个缓存中的数据!
wq8987 2008-10-06
  • 打赏
  • 举报
回复
为每个用户的操作写一个缓存,将这些数据先缓存到磁盘上!
如果没有出错就把缓存中的数据写入数据库,否则删除这个缓存中的数据!
113244 2008-09-18
  • 打赏
  • 举报
回复
mark...
bj_leo_2000 2008-09-18
  • 打赏
  • 举报
回复
主要是把卡中的票据数据都要保存起来
hyde100 2008-09-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 bj_leo_2000 的回复:]
我做的是票据申报管理系统,用户是把数据写入到一个卡里,由指定设备读取。由于需要读卡的用户很多,所以要很多地方读卡,而且为了保证数据准确性,一次性读出的数据如果有一条记录是错误的,这次所有的数据就都不能保存在数据库中,很麻烦,呵呵。
[/Quote]
读卡记录也需要保存?
bj_leo_2000 2008-09-18
  • 打赏
  • 举报
回复
我做的是票据申报管理系统,用户是把数据写入到一个卡里,由指定设备读取。由于需要读卡的用户很多,所以要很多地方读卡,而且为了保证数据准确性,一次性读出的数据如果有一条记录是错误的,这次所有的数据就都不能保存在数据库中,很麻烦,呵呵。
ChinaITOldMan 2008-09-18
  • 打赏
  • 举报
回复
learning
Novelty 2008-09-18
  • 打赏
  • 举报
回复
分批插入应该是个很好的选择。
bj_leo_2000 2008-09-17
  • 打赏
  • 举报
回复
那种多用户并发向一个表里插入1000至5000条数据的操作,是不是最好给每个用户都先建立个临时表,把数据先插入到临时表里,最后全部插入完成后再从临时表向正式表里出入新数据,如果在向临时表里出错就只需将临时表删除。这种方式能不能解决并发及纠错问题了
jinjazz 2008-09-17
  • 打赏
  • 举报
回复
如果是.net可以用sqlbulkcopy

pb不熟悉,你先把数据一条条insert到临时表中,然后去统一insert到主表。这样可把负载转嫁给tempdb,而且循环过程中不受索的影响。
lxuan_025 2008-09-17
  • 打赏
  • 举报
回复


不懂 帮顶
jinjazz 2008-09-17
  • 打赏
  • 举报
回复
你可以测试一下,应该可以的
zjcxc 2008-09-16
  • 打赏
  • 举报
回复
你的这个操作是经常做? 还是偶尔一次?
是一定要多个用户同时进行?
如果全部用一个事务, 服务器的资源开销会很大, 根据具体业务分析一下可否能够拆开, 或者考虑能否在插入后校验

另外, 你的插入方法有没有值得改进的? 比如是否可以用 bcp(ado.net 2.0中的 sqlbulk 对象)这类快速插入的方法?


昵称被占用了 2008-09-16
  • 打赏
  • 举报
回复
如果一个事务太大,影响性能,而必须把它拆分,则必须编写一定的恢复事务的代码,也就是说你一个事务拆成三个,你必须编写第一段事务的恢复过程,第二段事务的恢复过程,这样,万一第三段出错,需要一次执行第二段事务的恢复过程、第一段事务的恢复过程。
这么做也有前提,就是你的事务的恢复是可以用代码来实现的,有些事务是没法这么做的
昵称被占用了 2008-09-16
  • 打赏
  • 举报
回复
用不用事务处理,或者说事务包括的处理到底多大,这些都是应该根据业务需求来决定的。

Garnett_KG 2008-09-16
  • 打赏
  • 举报
回复

(1) 去掉表上的主键,让表变成堆表

(2) 加上SET XACT_ABORT ON

TRY:

SET XACT_ABORT ON

BEGIN TRAN
INSERT INTO Table....

INSERT INTO Table...

COMMIT TRAN

bj_leo_2000 2008-09-16
  • 打赏
  • 举报
回复
有什么好方法能代替回滚操作吗?
bj_leo_2000 2008-09-16
  • 打赏
  • 举报
回复
我是在pb里写insert语句直接插入的,如何优化插入?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧