事务与sql语句的分类

一 。sql语言操作分类: 

   1 数据定义语言DDL (DATA DEFINE LANAGUAGE)  (定义,操作数据的结构) 【-->java的变量定义】 

       CREATE : 在数据库中创建新的数据对象 
       ALTER : 修改数据库中对象的数据结构 
       DROP : 删除数据库中的对象 
       DISABLE/ENABLE TRIGGER : 修改触发器的状态 
       UPDATE STATISTIC : 更新表/视图统计信息 
       TRUNCATE TABLE : 清空表中数据 
       COMMENT : 给数据对象添加注释 
       RENAME : 更改数据对象名称 

     2数据操作语言DML 

        DML(Data Manipulation Language)(CRUD),用于添加/修改/查询数据库中数据。 

       DML包含以下语句: 
       INSERT :将数据插入到表或视图 
       DELETE :从表或视图删除数据 
       select :从表或视图中获取数据 
       UPDATE :更新表或视图中的数据
       MERGE : 对数据进行合并操作(插入/更新/删除) 

    3数据控制语言DCL 

        DCL(Data Control Language)用来向用户赋予/取消对数据对象的控制权限。

       DCL包含以下语句:
       GRANT : 赋予用户某种控制权限 
       REVOKE :取消用户某种控制权限 

   4. 事务控制语言(TCL) 

        TCL(Transaction Control Language)用来对事务进行管理。 

       TCL包含以下语句: 
       COMMIT : 保存已完成事务动作结果 
       SAVEPOINT : 保存事务相关数据和状态用以可能的回滚操作 
       ROLLBACK : 恢复事务相关数据至上一次COMMIT操作之后 

       SET TRANSACTION : 设置事务选项 

二。 crud (create read update,delete)

     所有的数据库  都是使用这四个单词来描述增删改查 isud  (insert select update delete)
     1 insert语句
       语法:
          INSERT INTO 表名[(列名1,列名2,…)] VALUES(值1, 值2,…);   --列名的个数和值的个数 必须相同              【表列较多 建议使用】
          insert into 表名  values(值1,值2 .。。)   --如果没有指定列名  值得个数必须和表中所有的列的个数相同 列的类型必须匹配   【表列较少 建议使用】
          INSERT INTO 表名[(列名2,列名1,…)] VALUES(值2,值1, …); 值得顺序和列的顺序保持一致
          insert into student select '11','test1',25,'女'  from dual   --根据常量来模拟
          insert into student1 select * from student      --可以根据 insert into select语句来进行复制表的数据 (备份表)    seelct查询的列数必须和insert插入的表列数一致 并且列类型匹配


          日期类型的插入
              insert into student1 values(7,'a',20,'男',sysdate)
              insert into student1 values(7,'a',20,'男',to_date('1987-06-18','yyyy-MM-dd'))
     2 update语句(注意在修改之前一定先将条件写好)
          语法:
            UPDATE 表名 SET 列名=值[,列名2=值2,…] [WHERE 修改条件];  --
     3 delete语句(注意在修改之前一定先将条件写好)
            delete scott.emp where empno='8110'

三。 事务

     事务表示 一段sql的执行 要么同时成功 要么同时失败 
            任意的dml语句【数据的修改】 必须要提交数据(因为用户的误操作 导致数据的损坏 有可能导致无法挽回的灾难  可以使用 事务的机制来解决这类问题)
     commit(提交) 一旦提交了事务 数据就被修改到物理的数据文件中  (ctrl+s) 保存到文件
     rollback(回滚) 如果除了误操作 需要回滚当前事务 (记事本ctrl+z)(撤回)
     事务的acid属性
原子性(Atomic):
指整个数据库事务是不可分割的工作单元。原子性确保在事务中的所有操作要么都发生,要么都不发生。
  举例:
     --被一起的执行的dml语句位于同一事务当中
insert into scott.emp values(8111,'test','MANAGER',7934,sysdate,3000,100,10);
insert into scott.emp values(8112,'test','MANAGER',7934,sysdate,3000,100,10);
insert into scott.emp values(8113,'test','MANAGER',7934,sysdate,3000,100,10);
rollback;
一致性(Consistency):
一旦一个事务结束了(不管成功与否),系统所处的状态和它的业务规则是一致的。即数据应当不会被破坏。
  举例: 
     insert into scott.emp values(8113,'test','MANAGER',7934,'2012-12-15',3000,100,10);
 一旦数据被约束成某种 类型或者某些值 那么就必须对应满足这些类型或者某些值
隔离性(Isolation):
指多个事务同时操作同一数据时,每个事务都有各自的完整数据空间。
  未提交的数据  在其他的客户端中是无法看到因为 因为隔离性
持久性(Durability):
一旦事务完成,事务的结果应该持久化
  存到物理磁盘中(就是断电了 下次还能 看的到 )
    事务的提交方式【了解即可】
        默认数据库使用 手动(非自动)提交方式 需要操作者 使用commit关键字来提交
           SQL> show autocommit;
                autocommit OFF

   设置自动提交
  SQL> set autocommit on;
  SQL> insert into scott.emp values(8113,'test','MANAGER',7934,sysdate,3000,100,10);


已创建 1 行。


提交完成。
隐式的事务提交(不需要使用commit和rollback也会自动提交)
   1 自动隐式提交事务:
                  执行一个DDL语句、执行一个DCL语句、从SQL*Plus正常退出(exit,quit)
2自动隐式回滚事务:
                  强行退出SQL*Plus、客户端到服务器的连接异常中断、系统崩溃  
回滚点
           savepoint a;
insert into scott.emp values(8113,'test','MANAGER',7934,sysdate,3000,100,10);
savepoint b;
insert into scott.emp values(8114,'test','MANAGER',7934,sysdate,3000,100,10);
rollback to a; --没有记录被插入
rollback to b  -- 8113被插入 8114被回滚
commit;
事务引发的问题和隔离级别【重点】

   事务 对同一行数据进行操作时  必须等先操作的客户端 提交或者回滚事务后 另外一个客户端才能操作数据(锁)
        事务操作同一行数据出现的问题 (并发的引发的问题)
  脏读  【是一种错误】
     读取到了用户未提交的数据  oracle数据库永远不会出现脏读
  不可重复读 【只是一种设计问题】
     在读取的事务中 两次重复读取同一行数据 发现数据 被更改了  
  幻读【只是一种设计问题】
     在读取的事务中 两次读取某一个条件的多条数据时 发现多出了几条数据
 
         隔离级别 (就是为了解决事务操作同一份数据导致的问题)  
READ UNCOMMITTED: 读未提交数据。脏读、不可重复读、幻读都可能发生。它的事务隔离性最低。
READ COMMITTED:读已提交数据。解决了脏读。【数据库的默认的隔离级别】
REPEATABLE READ:可重复读。解决不可重复读,脏读。
SERIALIZABLE:串行化。解决任何并发事务问题。最严格的事务
Oracle只支持READ COMMITTED和SERIALIZABLE。
        默认为READ COMMITTED
 
   设置隔离级别
           alter session set isolation_level=serializable;--如果需要演示 必须每个客户端都要执行

你可能感兴趣的:(oracle)