怎么允许多个事务同时修改同一个表但不同的记录

humanity 2010-01-13 10:40:03
不知道怎么能准确搜索到过去的文章,就直接问一下:
现在我有三个表,A=40000条,B=300000条, C=250000条 数据,现在 A 有两个子表 B和 C,我们批量转换数据(不光是直接导入,有好多计算在里面),现在为了加快速度,用多速度,开多个事务处理,A表最复杂,试了多线程会导致数据搞错,不过,A 表使用单线程也没关系,主要是 C 表最快,现在这种问题,处理 B / C 表时都只是把属于同一个 A 记录来一个事务处理,因此我想,我可以允许事务间不隔离开就能跑。因为每个事务不会更新或访问相同的记录,之前没有设置事务隔离的话,每个事务都在等前一个事务提交,是不是因为整个表C 被锁住。请问如何做到不锁整个表?
...全文
283 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
humanity 2010-01-14
  • 打赏
  • 举报
回复
A 表在 B / C 中都有记录,在 B 中有唯一键 (A_KEY, SEQ), 在 C 中有唯一键(A_KEY, SEQ)。

假设 A 中有 #1,#2, 现在需要插入 #1 的记录 #1C1,#1C2, #2C1, #2C2 到 C 表中,如果这些记录的状态是 02 同时还需要向 B 表中插入数据 #1B1,#B2, #2B1,#2B2 (#1/#2 前缀表示它们属于哪条 A 记录).

它们需要读取 C 中的最大 SEQ (A_KEY + SEQ 是唯一的), 之后需要向里面 insert 记录.
现在多个线程各开一个连接一个事务同时处理数据时,我觉得似乎它们等待,不知道哪个环节在等。

Q1: 我之前以前是锁住整个表了,请问怎么看这些 SQL 是否在等锁花了时间?
Q2: 可以通过把事务隔离级别降到最后吗来提高速度吗,下面四个级别最第一个最低吗?

Connection.TRANSACTION_READ_UNCOMMITTED
Connection.TRANSACTION_READ_COMMITTED
Connection.TRANSACTION_REPEATABLE_READ
Connection.TRANSACTION_SERIALIZABLE
wh62592855 2010-01-13
  • 打赏
  • 举报
回复
oracle默认就是行级锁
在表级加的是共享锁
只要你不更改表结构就行
luyi6101 2010-01-13
  • 打赏
  • 举报
回复
select * from table where col='***' for update
crazylaa 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wh62592855 的回复:]
oracle默认就是行级锁
在表级加的是共享锁
只要你不更改表结构就行
[/Quote]

是的,试着把你锁整个表的for update去掉。
SambaGao 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wh62592855 的回复:]
oracle默认就是行级锁
在表级加的是共享锁
只要你不更改表结构就行
[/Quote]

..是的
wisdomhxz 2010-01-13
  • 打赏
  • 举报
回复
Oracle好像不会锁整个表的,只锁对应修改的那一行记录

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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