oracle什么时候需要commit

DML语言,比如update,delete,insert等修改表中数据的需要commit;
DDL语言,比如create,drop等改变表结构的,就不需要写commit(因为内部隐藏了commit);

DDL 数据定义语言:
create table 创建表
alter table 修改表
drop table 删除表
truncate table 删除表中所有行
create index 创建索引
drop index 删除索引
当执行DDL语句时,在每一条语句前后,oracle都将提交当前的事务。如果用户使用insert命令将记录插入到数据库后,执行了一条DDL语句(如create
table),此时来自insert命令的数据将被提交到数据库。当DDL语句执行完成时,DDL语句会被自动提交,不能回滚。

DML 数据操作语言:
insert 将记录插入到数据库
update 修改数据库的记录
delete 删除数据库的记录
当执行DML命令如果没有提交,将不会被其他会话看到。除非在DML命令之后执行了DDL命令或DCL命令,或用户退出会话,或终止实例,此时系统会自动
发出commit命令,使未提交的DML命令提交。

DDL  :
Data Definition Language (DDL) statements are used to define the database structure or schema. Some examples:

CREATE - to create objects in the database

ALTER - alters the structure of the database

DROP - delete objects from the database

TRUNCATE - remove all records from a table, including all spaces allocated for the records are removed

COMMENT - add comments to the data dictionary

RENAME - rename an object

DML:

Data Manipulation Language (DML) statements are used for managing data within schema objects. Some examples:

SELECT - retrieve data from the a database

INSERT - insert data into a table

UPDATE - updates existing data within a table

DELETE - deletes all records from a table, the space for the records remain

MERGE - UPSERT operation (insert or update)

CALL - call a PL/SQL or Java subprogram

EXPLAIN PLAN - explain access path to data

LOCK TABLE - control concurrency

DCL

Data Control Language (DCL) statements. Some examples:

GRANT - gives user‘s access privileges to database

REVOKE - withdraw access privileges given with the GRANT command

TCL

Transaction Control (TCL) statements are used to manage the changes made by DML statements. It allows statements to be grouped together into logical transactions.

COMMIT - save work done

SAVEPOINT - identify a point in a transaction to which you can later roll back

ROLLBACK - restore database to original since the last COMMIT

SET TRANSACTION - Change transaction options like isolation level and what rollback segment to use

锁概念基础

数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

Oracle数据库的锁类型

根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。

DML锁的目的在于保证并发情况下的数据完整性,。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。

在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

http://www.cnblogs.com/zhouzangood/articles/5009652.html
时间: 2024-10-07 00:58:44

oracle什么时候需要commit的相关文章

oracle什么时候须要commit

今天在oracle的SQL plus 中运行了删除和查询操作,然后在PL/SQL中也运行查询操作,语句一样,结果却不一样,让我大感郁闷,后来才突然想到可能是两边数据不一致造成的,可是为什么不一致呢,就是没用commit, 在网上查了一下,大概是这样说的: DML语言,比方update,delete,insert等改动表中数据的须要commit; DDL语言,比方create,drop等改变表结构的,就不须要写commit(由于内部隐藏了commit); DDL 数据定义语言:create tab

【Oracle123】Oracle什么时候需要commit

https://www.cnblogs.com/qingxinblog/articles/3373851.html DML语言,比如update,delete,insert等修改表中数据的需要commit;DDL语言,比如create,drop等改变表结构的,就不需要写commit(因为内部隐藏了commit); 原文地址:https://www.cnblogs.com/cathygx/p/11719448.html

How To Commit Just One Data Block Changes In Oracle Forms

You have an Oracle Form in which you have multiple data blocks and requirement is to commit just one data block changes and not to effect any other data blocks. But suppose you have a commit_form button also in form which will commit all the data blo

Oracle过程:%TYPE,%ROWTYPE,CURSOR,INTO,FOR...LOOP

/*创建一个过程,ORACLE PL/SQL语法*/ CREATE OR REPLACE PROCEDURE MYPROC AS    v_id     t_user.id%TYPE; /*声明变量,类型与指定表字段一致*/    v_user   t_user%ROWTYPE; /*声明变量,表示一行记录,结构与指定表一行记录一致*/    CURSOR c_user IS SELECT * FROM t_user; /*声明游标,表示多行记录,每一行结构与查询结果一致*/ BEGIN    

Oracle的内存数据库战略

此文简介了Oracle内存数据库的两大分支,TimesTen和Database In-Memory,非常值得一读,两种技术的重要特性完全涵盖,可以让读者很快的对Oracle内存数据库技术的关键点有一个全面的认识,建议看完此文后可以对参考中的原文再读一遍. 概述 随着内存容量不断增大,价格不断下降,将全部的用户数据置入内存已避免昂贵的I/O已成为可能. Oracle提供两种互补的内存数据库技术,用于应用层和数据库层: 1) TimesTen 可以部署在数据库层,作为独立的数据库:或在应用层作为后端

oracle基本操作 转载

ORACLE的简单介绍 ORACLE公司是一家提供综合技术产品.方案.服务的数据库公司 ORACLE数据库设计成可大量存储数据,快速查询数据,保证数据的安全和一致性,跨网络的分布式管理及客户-服务器的配置等. ORACLE SQL语法符合ANSI 1986标准SQL 和数据库交流的命令式语言 SQL*PLUS ORACLE的一种工具, 用来运行SQL和PL/SQL语句 PL/SQL ORACLE的过程化编程语言 一.选择行 1. 简单的SELECT 语句 SELECT [DISTINCT] {*

对oracle数据库进行增删改更新操作,executeUpdate()执行卡住了

原因是:oracle数据库更新数据后需要commit,不然会堵塞,就会卡住 那么每次调用executeUpdate()完后,数据库要自动commit才可以. 我的基类加了一下,注意红色字体部分代码: //增删改 public int executeUpdate(String sql,Object[] params){ int update = 0; try { pstm = connection.prepareStatement(sql); for(int i=0;i<params.length

相同更改数据量的前提下,单次COMMIT和多次COMMIT对日志空间浪费的影响对比

LGWR进程按照顺序写在线日志,中间不会跳跃,而且LGWR进程不会在同一个日志快写2次,即使一次写入的日志快只占几个字节,下次不会再用了,这就造成日志空间的浪费.Oracle做一次Commit,就会触发LGWR进程进行日志缓冲到日志文件的写入操作,因此可以说更改相同数据量的前提下,如果提交过于频繁,产生的日志可能就会越多,即使第一次Commit占用的日志块仍可以存储下一次需要写入的日志缓冲,那么下一次Commit会再次占用一个新的日志块. 实验: 1.系统的日志块大小是512字节. SQL> s

Oracle、MySQL和Sqlserver的事务管理、分页和别名的区别

1.在mysql中事务默认是自动提交的,只有设置autocommit为0的时候,才用自己commit(commit--rollback回滚) 2.但是在oracle中必须自己commit;不然就只能结束这次事务之后才会提交 3.在sql server中go命名在我的理解和commit命令相同,就是为了完成一个事务提交的 4.对于分页,mysql使用limit.sql server使用top.oracle使用ROWNUM等伪列 5.oracle中的varchar2和varchar相比,具备了向后兼