insert append需要注意的一个小问题

本文解析了Oracle数据库中ORA-12838错误的原因及解决办法,此错误发生于同一事务内尝试对已进行并行修改的表执行读取或修改操作。文章详细介绍了insert append操作的特点及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ORACLE报出错误如下:

ORA-12838: cannot read/modify an object after modifying it in parallel
解释如下:
ORA-12838 cannot read/modify an object after modifying it in parallel
Cause: Within the same transaction, an attempt was made to add read or modification statements on a table after it had been modified in parallel or with direct load. This is not permitted.
Action: Rewrite the transaction, or break it up into two transactions: one containing the initial modification and the second containing the parallel modification operation

 

   分析

        

用insert append可以实现直接路径加载,速度比常规加载方式快。但有一点需要注意: insert append时在表上加“6”类型的锁,会阻塞表上的所有DML语句。因此在有业务运行的情况下要慎重使用。若同时执行多个insert append对同一个表并行加载数据,并不一定会提高速度。因为每一时刻只能有一个进程在加载(排它锁造成)。

         我先执行了一个delete语句,又执行了insert append. 这个delete语句并没有造成后面的insert append报错。但在我执行了一个insert append之后,再执行任何DML语句都会报错。

        所以在业务满足的条件下,执行玩append后应立即提交或者回滚。

### AppendInsert 的区别 在编程中,`append` 和 `insert` 是用于向集合或序列添加元素的方法,但在同语言中的实现细节有所同。 #### Python 中的 AppendInsert 方法 对于 Python 列表来说: - **Append**方法会将给定的对象作为单个元素追加到列表的末尾。这意味着如果传入的是另一个列表,则该整个列表会被视为单一元素加入原列表[^3]。 ```python my_list = [1, 2, 3] my_list.append(4) print(my_list) # 输出: [1, 2, 3, 4] another_list = ['a', 'b'] my_list.append(another_list) print(my_list) # 输出: [1, 2, 3, 4, ['a', 'b']] ``` - **Insert**方法允许指定位置参数,在此索引处插入新元素并将后续元素右移。这提供了更灵活的操作方式,可以在任何地方而是仅限于结尾添加项目。 ```python my_list = [1, 2, 3] my_list.insert(0, 'start') print(my_list) # 输出: ['start', 1, 2, 3] my_list.insert(len(my_list), 'end') # 或者简单地使用 my_list.append('end') print(my_list) # 输出: ['start', 1, 2, 3, 'end'] ``` #### Go 语言中的 Append 特性 而在Go语言里并没有直接对应的`insert`函数;相反,它有一个功能强大的内置函数叫做`append`,它可以接受多个参数并把它们依次附加到切片(slice)后面。值得注意的是,当传递给它的最后一个实参是一个相同类型的切片时,这个切片的所有成员都会被复制过来而非作为一个整体项处理[^1]。 ```go package main import "fmt" func main() { s := []int{1, 2, 3} fmt.Println(s) // 添加单个元素 s = append(s, 4) fmt.Println(s) t := []int{5, 6} // 合并两个slice s = append(s, t...) fmt.Println(s) } // 打印结果: //[1 2 3] //[1 2 3 4] //[1 2 3 4 5 6] ``` 尽管如此,要在特定位置插入元素的话,通常的做法是先创建一个新的更大容量的切片,再通过循环或者其他手段移动原有数据来腾出空间放置新的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值