sql与oracle 事务的区别
- 格式:doc
- 大小:23.50 KB
- 文档页数:2
Oracle与sql区别一,字串连接Oracle使用两个竖线符号(||)来作为字串连接操作符,而SQL Server则使用加号(+)。
二,模式匹配SQL Server的LIKE关键字提供了有用的通配符搜索功能,这个功能在Oracle中不支持除了所有的RDBMS都支持的(%)和(_)通配符以外,SQL Server还支持([])和([^])通配符。
([])字符用来查询在一个范围内的所有单个字符。
例如,如果你需要查询包含一个从a到f的字符的数据,三,性能SQL多用户时性能不佳,Oracle在所有的数据库中性能最高,在多用户性能也很强大,执行查询速度也非常快,四,游标的区别Oracle在使用SELECT语句时总是需要游标,不管从数据库中请求多少行。
在Microsoft SQL Server,SELECT语句并不把在返回客户的行上附加游标作为缺省的结果集合。
这是一种返回数据给客户应用程序的有效的方法。
SQL Server为游标函数提供了两种接口。
当在Transact-SQL批处理或者存储过程中使用游标的时候,SQL语句可用来声明、打开、和从游标中抽取,就像定位更新和删除一样。
当使用来自DB-Library、ODBC、或者OLEDB程序的游标时,SQL Server,显式的调用内建的服务器函数来更有效的处理游标。
当从Oracle输入一个PL/SQL过程时,首先判断是否需要在Transact-SQL中采用游标来实现同样的功能。
如果游标仅仅返回,组行给客户程序,就使用非游标的SELECT语句来返回缺省的结果集合。
如果游标用来从行中一次取得一个数据给本地过程变量,你就必须在Transact-SQL中使用游标。
五,语句块Oracle PL/SQL和Microsoft SQL Server Transact-SQL都支持用BEGIN…END术语来标记语句块。
Transact-SQL不需要在DECLARE语句后使用一个语句块。
基本定义1、如果列别名有大小写之分,并包含特殊字符或空格,那么这样的别名必须用双引号引住;2、日期数据的默认显示格式为“DD-MON-YY”,如果希望使用其他格式显示,那么必须调用TO_CHAR函数进行转换。
例:select ename,TO_CHAR(hiredate,’yyyy-mm--dd’) from emp3、使用算术表达式当执行查询操作时,可以在数字列上使用算术表达式,其中乘、除的优先级要高于加减。
如要改变优先级,可以使用括号;4、NVL函数用于将NULL转变为实际值,语法为NVL(表达式1,表达式2),如果表达式1为NULL,则返回表达式2,;如果表达式1不是NULL,则返回表达式1.参数表达式1,表达式2可以是任意数据类型,但二者的数据类型必须要匹配。
例:select ename,sal,comm,sal+nvl(comm,0) from emp;5、在where条件中使用数字值当在where条件中使用数字值时,既可以使用单引号引住数字值,也可以直接引用数字值。
6、在where条件中使用日期值必须要用单引号引住,并且日期值必须要符合日期显示格式。
如果日期值不符合默认日期格式,那么必须使用TO_DATE函数进行转换;7、在where条件中使用between…..and操作符用于指定特定范围条件,在between操作符后指定较小的一个值,在and操作符后指定较大的一个值;例:select * from emp where sal between 100 and 1000;8、在where条件中使用in操作符用于执行列表匹配操作。
当列或表达式结果匹配于列表中的任一个值时,条件字句返回true。
例:select * from emp where sal in(100,200);9、使用order by字句在执行查询操作时,默认情况下会按照数据插入的先后顺序来显示数据。
但在实际应用中经常需要对数据进行排序,以显示更直观的数据。
SQL和Oracle 对数据库事务处理的差异性作者:Jake, 岀处:IT专家网论坛,责任编辑:陈子琪,2009-10-11 13:00背景在吉日嘎拉的软件编程走火入魔之:数据库事务处理入门(适合初学者阅读)文章中关于MS SQL Server 和Oracle对数据库事务处理的差异性引起一些争论,因此记录我对数据库事务处理的想法。
简介本文讲述 MS SQL Server 和Oracle对数据库事务处理的差异性,以及Oracle如何对事务处理的实现。
什么是事务数据库事务(Database Transaction)是一组数据库操作的处理单元。
事务符合ACID 的特性:Atomic :原子性,要么全部要么一无所有。
All or No ne.Con siste nt: —致性,所有依赖关系以及约束一致。
Isolated:分离性,不同事务不互相影响。
Durable:持久性,提交事务的数据需要持久化。
为什么要使用事务实现事务主要有两大功能:1•保证数据库的consistent(—致性状态),保持所有依赖关系以及约束一致)。
哪怕数据库管理系统出现故障时(例如断电),也能恢复到一致性状态。
例如一个银行转帐系统,张三给李四转3000 圆RMB,张三帐号上减 3000和李四帐号上加 3000需要同时完成,否则系统的帐就不平了。
也例如有些销售系统的汇总表和明细表,是一个主表和一个从表,需要同步更新。
2.并发时分离不同事务操作。
例如编辑过程中的数据不给其他事务查询到。
这也是相对的,在特效需求下可能要支持dirty read(脏读),但不是这里讨论的范围了。
SQL Server 2008 的事务类型1.自动提交事务 Autocommit Transactions这是SQL Server 默认的事务类型,每一条单独的SQL语句(SQL statement)都是单独的一个事务,语句执行完毕后自动提交。
调用方不需要手工控制事务流程。
SQLServerMySqlOracle语法对⽐及区别操作SQLServer Oracle Mysql查看表结构exec sp_help 表名desc 表名在command window看desc 表名或 describe 表名或show columns from 表名;修改数据库名称exec sp_renamedb ‘旧数据库名’,’新数据库名’不详修改表名exec sp_rename ‘旧表明’,’新表明’rename 旧表名 to 新表名alter table 表名 rename to 新表名修改列名exec sp_rename ‘表.旧列名’,’新列名’alter table 表名 rename column 旧列名 to 新列名alter table test change column address address1 varchar(30)--修改表列名删除数据库drop database 数据库名不详Drop database添加表中⼀列alter table 表名 Add 列名数据库类型alter table 表明 add(列名数据类型) 或alter table 表名 Add 列名数据库类型alter table test add column name varchar(10); --添加表列删除表中⼀列alter table 表名 drop column 列名alter table 表名 drop column 列名alter table test drop column name;修改表现有列alter table 表名 alter column 列名新数据库类型⼤⼩alter table 表明 modify(列名数据类型)alter table test modify address char(10) --修改表列类型||alter table test change address address char(40)删除约束alter table 表名 drop constraint约束名完全⼀样添加主键约束alter table 表名add constraint 主键约束名primary key (列名)完全⼀样alter table 表明add primary key (列名)删除主键约束alter table 表名 drop primary key添加唯⼀约束alter table 表名add constraint 唯⼀约束名unique (列名)完全⼀样alter table 表名 add unique (列名)添加默认约束alter table 表名add constraint default (值) for 列名完全⼀样添加检查约束alter table 表名add constraint check (列名 > 10)完全⼀样添加外键约束alter table ⼦表add constraint 外键约束名foreign key(⼦表的列名) references 主表 (列名)on update cascade / on updateaction注意:默认和加 on update action 表⽰更新受限加on update cascade 表⽰更新不受限,多项操作时⽤逗号隔开完全⼀样添加索引约束alter table 表名 add index 索引名 (列名)添加普通索引:create index 索引名 ON 表名 (列名)添加唯⼀索引:create unique索引名 ON 表名 (列名)删除索引drop index 索引名 on 表名alter table 表名 drop index 索引名⾝份: exec sp_grantlog域名\密码’⾝份: exec sp_addlogin ‘登陆’,’密码’SET PASSWORD FOR'username'@'host'= PASSWORD('newpassword');数据库名⾝份: Exec域名密码’,’数据库⽤户名’⾝份: Exec sp_grantdbaccess登陆帐户’,’数据库⽤户名’create user HDEAM_TYMBidentified by ""default tablespace HDEAM_TYMBtemporary tablespace TEMPprofile DEFAULT;mysql>insert intoer(Host,User,Password,ssl_cipher,x509_issuer,x509_subject) values("localhost","pppadmin",password("passwd"),'','','');CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456';CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY'123456';CREATE USER 'pig'@'%' IDENTIFIED BY '123456';CREATE USER 'pig'@'%' IDENTIFIED BY '';CREATE USER 'pig'@'%';权限 [on 表明] to 数据库grant dba to HDEAM_TYMB with admin option;-- Grant/Revoke system privilegesgrant unlimited tablespace to HDEAM_TYMBwith admin option;“abc”;grant all privileges on phplampDB.* to phplamp@localhostidentified by '1234';mysql>flush privileges;权限 [on 表名] from 数据REVOKE SELECT ON*.* FROM'pig'@'%';数据库’drop user HDEAM_SBFF cascade;mysql>Delete FROM user Where User="phplamp" andHost="localhost";mysql>flush privileges;⾝份: exec sp_droplogin⾝份: exec sp_revokelogin 登分离数据库:数据库名附加数据库:数据库名,主数据⽂件路径’,⽇志⽂件路径’exp hdeam_product/d3B68Apk29v34Dj@orclfile=E:/tymb.dmp log=E:/tymb.logimp HDEAM_LHSH/HDEAM_LHSH@orcldevfile=E:\TYMBHDEAM_BAK_2013-03-25.dmpfull=Y;mysqldump -h localhost -u root -pmysql oa >d:\oa.sqlmysql -h localhost -u root -p jira<d:\jira.sql:Select *select * from表)Exec Sp_helpExecExec数据库名exec表名exec sp_helpindex注意: 下⾯都是通过( select * from 对象 ) 来查看信息触发器 user_triggers过程 user_procedures查看源代码 user_source查看数据库对象 user_objects查看错误信息 show errors查看索引信息 user_indexes查看分区索引 user_ind_partitions查看有关基于列创建的索引 user_ind_columns查看表空间 -- user_tablespaces查看所有数据库 show databases;查看库所有表 show tables;查看表结构和属性use information_schema;select * from columns where table_name=’表名’查看表源代码show create table 表名;查看存储过程源代show create procedure 过程名查看视图源代码show create procedure 过程名查看视图资代码show create VIEW 视图名查看表的索引show index from 表名查看表的索引show keys from 表明表储蓄过/空过程,函数,视图,表的源代码:对象名::查看序列 -- user_sequences查看同义词 -- user_ind_columns查看⽤户表信息 -- user_tables查看⽤户所有的表信息 user_all_tables查看表的索引show keys from 表明sysdate NOW()varchar2(20)不⼀定要指定具体列名必须指定具体列名标识的开始值, 标识种右)create sequence 序列名1.序列名.nextval 获取下⼀个序列的值2.序列名.currval 获取当前的序列的值: *.mdf =1 :*.ndf >=0 : *.log >=1数据⽂件: *.dbf >=1⽇志⽂件: *.log >=11位置开始查找t字符串(默认从1开始)从pos位置len获取字符串的长度把字符串全部转换成把字符串全部转换成清除左边的空格清楚右边的空格从左边返回指定长度的从右边返回指定长度将s t替换成字符串我的⾳乐我’)A我的⾳乐我的世界EFG2位置开3的字符串,并在该位置索引从1开始substr(char, pos, len) 截取字符串length(char) 返回字符串的长度lower(char) 转换为⼩写upper(char) 转换为⼤写trim() 截取左右空格initcap(char) ⾸字母⼤写ltrim(char,set) 左剪裁rtrim(char,set) 右剪裁replace(char oldchar, newchar) 字符串替换concat(char1, char2) 连接字符串cha(67) 根据ASCII码返回对应的字符lpad()和rpad() 在字符串的左边或右边添加东西需要3个参数第⼀个是字符串第⼆个是返回值的总长度, 第三个是⽤来填充的字符值 as varchar) 不需指定长度to_char(d|n, fmt)将数字或⽇期转换为指定格式的值 as varchar) 不需指定长度值) 必须指to_char(d|n, fmt)将数字或⽇期转换为指定格式的字符串to_date(char,frm)将char 或varchar 转换为⽇期数据类型to_number() 将包含数字的字符转换为number数据类型取绝对值取上界最⼩整取下界最⼤整数取幂四舍五⼊,正数返回1 ,负数返-1求平⽅根获取计算机名称nvl(ex1,ex2)如果ex1为null则返回ex2;如果ex1不为null则返回ex1;nvl2(ex1,ex2,ex3)如果ex1不为null则返回ex2如果ex1为null则返回ex3nullif(ex1,ex2)如果ex1=ex2则返回null 否则返回ex1;聚合)列名) 求这列的平均值列名) 求这列的最⼩值列名) 求这列的最⼤值统计所有的⾏包括重复列名) 统计指定列中⾮空值列名) 统计不是重复右句⽤于将信息表划分,按组进⾏聚合运算avg(列名) 求这列的平均值min(列名) 求这列的最⼩值max(列名) 求这列的最⼤值count(*) 统计所有的⾏包括重复值和空值count(列名) 统计指定列中⾮空值的个数count(distinct 列名) 统计不是重复值的个数group by右句⽤于将信息表划分为组,按组进⾏聚合运算返回当前系统时间返回指+指定部分后的⽇期返回返回指a. add_months(d,n) 返回给指定的⽇期加上指定的⽉数后的⽇期值 selectadd_months(sysdate,2) from dual;b. months_between(d,d) 返回2个⽇期之间的⽉数select months_between (date '2005-05-06',date '2005-9-01') from dual;c. last_day(d) 返回指定⽇期当⽉的最后⼀天的⽇期select last_day(sysdate) from dual;d. round(d, [fmt]) 返回⽇期值⽇期四舍五⼊为格式模型指定的单位 select round(date'2005-09-08','year') from dual; 返回 2005-01-01 selectround(date'2005-09-08','month') from dual; 返回2005-09-01 select round(date'2005-09-08','day')from dual; 返回最靠近的⼀个星期⽇e. next_day(d, day) 返回指定的下⼀个星期⼏的⽇期 select next_day(sysdate,'星期⼆') fromdualf.trunc 语法与round 相同区别:trunc 是只舍不⼊g.extract 提取⽇期时间类型中的特定部分|| 连接字符串⽤于将2个或多个字符串合并成⼀个字符串两个)重复的⾏select orderno from order_master union select orderno from order_detail;b.union all 合并2个查询选定的所有⾏包括重复的⾏c.intersect 返回2个查询都有的⾏d.minus 第1个查询在第2个查询中不存在的数据)个,⾄n-个条)::对1 :)左别名.列名,右别名.列from 左表 as 左别名 inner右表 as 右别名on 左别名.列= 右别名.列名左表名.列名,右表名.列from 左表 ,右表 where 左表.列名 = 右表名.列名左外连接:(返回左表的所有⾏,如null代替,存在则显⽰具体数,显⽰出来的总⾏数由左表决定)左别名.列名,右别名.列名左表 as 左别名 left join 右as 右别名on 左别名.列名 = 右.列名右外连接:(返回右表的所有⾏,如null代替,存在则显⽰具体数,显⽰出来的总⾏数由右表决定)左别名.列名,右别名.列名左表 as 左别名 right join右表 as 右别名on 左别名.列名 =完全⼀样连接分类:1内连接:条件2外连接1)左外连接: left join 或 left outer join2)右外连接:right join 或 right outer join3)完整外连接: Full join 或 Full outer join3交叉连接: from …4. 交叉连接:(返回左右表的所有⾏,如果左表没有与右表匹配的⾏则全部⽤null代替,如果右表没有与左表匹配的⾏则全部⽤null代替,存在则显⽰具体数据,显⽰出来的总⾏数=左表和右表⾏数和决定)Select 左别名.列名,右别名.列名 from 左表 as左别名 right join 右表 as 右别名on 左别名.列名= 右别名.列名完全拷贝: insert into ⽬标表源表部分拷贝: insert into ⽬标表 (列) select 列名 from 源表表不存完全拷贝: select * into 新表源表部分拷贝: select 列名 into 新from 源表拷贝表结构: select * into 新表源表 Where 1=2emp;b.拷贝⼀部分create table temp as select 列1,列2 from 表c.只拷贝⼀个空表(根据⼀个假条件)create table temp as select * from 表 where 1=2d.使⽤列别名: select stu_id, stu_name as "学⽣姓名" from student;A表,B1:⽬标表 set 列 = a.列 froma where a.关联列 = ⽬标表.2:列 = a.列 from 源a , ⽬标表b where a.关联列 =关联列3:⽬标表 set 列 = a.列 froma , ⽬标表b where a.关联列关联列4:⽬标表 set ⽬标表.列 = a.from 源表 a , ⽬标表 b where关联列 = b.关联列5:⽬标表 set⽬标表.列 = a.from 源表 a where a.关联列 =update ⽬标表a, 源表b set a.列 =b.列 where a.关联列 = b.关联列update ⽬标表a, 源表b set a.列 =b.列 where a.关联列 = b.关联列from 源表 a where a.关联列 = .关联列6:update语创建⼀个新表修改表中的列表名 alter column 列新数据库类型⼤⼩添加表中的列表名 Add 列名数据库删除表中的列表名 drop column 列删除表中的记录⽽不删除表的truncate table student只是查看表的结构删除表中的数据及表的结构a.创建⼀个新表create table student(stu_id int, stu_name varchar2(20)) tablespace lijiaob.修改表中的列alter table student modify(stu_name varchar2(40))c.添加表中的列alter table student add(stu_age int)d.删除表中的列alter table student drop column stu_agee.删除表中的记录⽽不删除表的结构truncate table studentf.只是查看表的结构desc studentg.删除表中的数据及表的结构drop table student;:.必须)a. commit 命令(⽤于提交并结束事务处理)commitb.savepoint 保存点类似于标记它将很长的事务处理划分为较⼩的部分他们⽤来标记事务中可以应⽤回滚的点save point savepoint_idc.rollbace work ,rollbackd.回滚到某个保存点rollback to savepoint伪列,但a.rowid(可以唯⼀的标识数据库中的⼀⾏)b.rownum (代表⾏的序号)rownum 不跟> , = , >= 操作使⽤储在,)变量名 = 值变量名 = 列名 from 表明列名 =⽤户)最后⼀个T-SQL错误号最后⼀次插⼊的标识本地服务器的名值’ 只出现在查询分析器中值’,16,1) 能在前台⽤条件) begin … end条件) begin …end else begin表名 where= 值)表名列名 = 值) begin …. enda) if condition then exp_bodyend if;b) if condition then exp_bodyelse exp_body end if;c) if condition then exp_bodyelsif condition then exp_bodyelse exp_body end if;1) loop condition end loop2) while condition Loop exp_body end loop3)for varable in [REVERSE] value1...value2 (varable 变量不需声明 , ... 是范围连接符 )loop exp_body end loop别名=case条件 then 值条件 then 值值表列名值 then 值值 then 值值表a) select case 列名when 值 then 值when 值 then 值else 值end case from 表明b) select casewhen 列名=值 then 值when 列名=值 then 值else 值end case from 表:1.列类型: %TYPEvarable tableName.columnName%TYPE;varable tableName.columnName%TYPE;2.⾏类型: %ROWTYPEvarable tableName%ROWTYPE;3.使⽤⾏类型:varable.列名;异常信息’,16,1) 能在 1)⾃定义异常:a)定义异常:(位 declare和 begin之间)DECLARE varable EXCEPTION;b)显⽰引发异常(为 begin 和 end 之间):RAISE varable;2)处理预定义异常:(位 begin 和 end 之间)EXCEPTIONwhen Too_Many_ROWS thenDBMS_OUTPUT.PUT_LINE('返回多⾏');when others thenDBMS_OUTPUT.PUT_LINE('全部处理');3) 引发应⽤程序错误:RAISE_APPLICATION_ERROR(error_number,error_message);原理: ):(重复⼦查询,不能单)(只执⾏⼀次,能单独执, 查询原理: 从外(外sql⼀次查出sql)到⾥把外不查出来的值传):查询到结果可以作为表来使⼀样切套⼦查询:Select * from AuthorBook a where CopyRight =(select Max(CopyRight) from AuthorBookwhere BookName = a.BopokName)(效率低)>连接查询(效), ⽽连. 右查询有连接查完全⼀样返回多⾏⼀列完全⼀样完全⼀样:只能出现在Group by分组,不能单独使⽤group by 就没有Having完全⼀样完全⼀样相对于mssql oracle显著的书写特点:1.代码⽚段必须放到begin end .. 中2.虚拟表 dual 的使⽤3.每⾏代码强制分号";"结束,包括end4.赋值符号 :=;(select xx into xx from daul;也可以⽤于赋值)5.省略了 as...补充:⼏种关系数据库中字符编码和存储长度需要注意的⼏个问题1.mysql中char(n) varchar(n) 中再utf8编码存储⽅式下数字表⽰的是字符数,但是在其他⽅式下就根据情况定,需要再相应环境下探索⼀下。
ORACLE和SQL语法区别归纳数据类型比较类型名称OracleSQLServer比较字符数据类型 CHAR CHAR 都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb变长字符数据类型 VARCHAR2 VARCHAR Oracle里面最大长度为4kb,SQLServer里面最大长度为8kb根据字符集而定的固定长度字符串 NCHAR NCHAR 前者最大长度2kb后者最大长度4kb根据字符集而定的可变长度字符串 NVARCHAR2 NVARCHAR 二者最大长度都为4kb日期和时间数据类型 DATE 有Datetime和Smalldatetime两种在oracle里面格式为DMY在SQLSerser里面可以调节,默认的为MDY数字类型 NUMBER(P,S) NUMERIC[P(,S)] Oracle里面p代表小数点左面的位数,s代表小数点右面的位数。
而SQLServer里面p代表小数点左右两面的位数之和,s代表小数点右面的位数。
数字类型 DECIMAL(P,S) DECIMAL[P(,S)] Oracle里面p代表小数点左面的位数,s代表小数点右面的位数。
而SQLServer里面p代表小数点左右两面的位数之和,s代表小数点右面的位数。
整数类型 INTEGER INT 同为整数类型,存储大小都为4个字节浮点数类型 FLOAT FLOAT实数类型 REAL REALORACLE内部函数大全以及与SQLSERVER的区别:下面是Oracle支持的字符函数和它们的Microsoft SQL Server等价函数。
函数Oracle Microsoft SQL Server把字符转换为ASCII :ASCII ASCII字串连接: CONCAT --------------(expression + expression)把ASCII转换为字符CHR, CHAR返回字符串中的开始字符(左起)INSTR ,---------------CHARINDEX把字符转换为小写LOWER ---------------------LOWER把字符转换为大写UPPER-------------------- UPPER填充字符串的左边LPAD --------------------N/A清除开始的空白LTRIM--------------------LTRIM清除尾部的空白RTRIM --------------------RTRIM字符串中的起始模式(pattern)INSTR --------------------PATINDEX多次重复字符串RPAD --------------------REPLICATE字符串的语音表示SOUNDEX --------------------SOUNDEX重复空格的字串RPAD --------------------SPACE从数字数据转换为字符数据TO_CHAR --------------------STR子串SUBSTR --------------------SUBSTRING替换字符REPLACE --------------------STUFF将字串中的每个词首字母大写INITCAP --------------------N/A翻译字符串TRANSLATE --------------------N/A字符串长度LENGTH-------------------- DATELENGTH or LEN列表中最大的字符串GREATEST-------------------- N/A列表中最小的字符串LEAST --------------------N/A如果为NULL则转换字串NVL-------------------- ISNULL日期函数下面是Oracle支持的日期函数和它们的Microsoft SQL Server等价函数。
SQL与Oracle对数据库事务处理的差异性(doc 8页)SQL 和Oracle对数据库事务处理的差异性作者: Jake, 出处:IT专家网论坛,责任编辑: 陈子琪,2009-10-11 13:00在吉日嘎拉的软件编程走火入魔之:数据库事务处理入门(适合初学者阅读)文章中关于MS SQL Server和Oracle对数据库事务处理的差异性引起一些争论,因此记录我对数据库事务处理的想法。
背景在吉日嘎拉的软件编程走火入魔之:数据库事务处理入门(适合初学者阅读)文章中关于MS SQL Server和Oracle对数据库事务处理的差异性引起一些争论,因此记录我对数据库事务处理的想法。
简介本文讲述MS SQL Server和Oracle对数据库事务处理的差异性,以及Oracle如何对事务处理的实现。
什么是事务帐就不平了。
也例如有些销售系统的汇总表和明细表,是一个主表和一个从表,需要同步更新。
2.并发时分离不同事务操作。
例如编辑过程中的数据不给其他事务查询到。
这也是相对的,在特效需求下可能要支持dirty read(脏读),但不是这里讨论的范围了。
SQL Server 2008 的事务类型1.自动提交事务Autocommit Transactions这是SQL Server默认的事务类型,每一条单独的SQL语句(SQL statement)都是单独的一个事务,语句执行完毕后自动提交。
调用方不需要手工控制事务流程。
2.显示事务Explicit Transactions调用方需要调用API或者使用T-SQL的BEGIN TRANSACTION语句来打开事务。
需要调用COMMIT或者ROLLBACK TRANSACTION 来提交或者回滚。
3.隐式事务Implicit Transactions使用SETIMPLICIT_TRANSACTIONS ON把事务模式变成隐式模式。
调用方不需要执行BEGIN TRANSACTION 语句来打开事务。
三.事务隔离级别在SQL92标准中,事务隔离级别分为四种,分别为:Read Uncommitted、Read Committed、Read Repeatable、Serializable,其中Read Uncommitted与Read Committed为语句级别的,而Read Repeatable与Serializable是针对事务级别的。
在Oracle和SQL Server中配置事务隔离级别的语句是相同的,都运用 SQL92标准语法,即:Set Transaction Isolation Level Read Committed上面示例中的Read Committed可以被替换为其他三种隔离级别中的任意一种。
1.SQL Server中的隔离级别及实现机制在SQL Server中提供了所有这四种隔离级别。
下面我们讨论在SQL Server中,这几种隔离级别的意思及其实现方式。
Read Uncommitted:一个会话可以读取其他事务未提交的更新结果,如果这个事务最后以回滚结束,这时的读取结果就可能是不正确的,所以多数的数据库运用都不会运用这种隔离级别。
Read Committed:这是SQL Server的缺省隔离级别,配置为这种隔离级别的事务只能读取其他事务已经提交的更新结果,否则,发生等待,但是其他会话可以修改这个事务中被读取的记录,而不必等待事务结束,显然,在这种隔离级别下,一个事务中的两个相同的读取操作,其结果可能不同。
Read Repeatable:在一个事务中,如果在两次相同条件的读取操作之间没有添加记录的操作,也没有其他更新操作导致在这个查询条件下记录数增多,则两次读取结果相同。
换句话说,就是在一个事务中第一次读取的记录保证不会在这个事务期间发生改动。
SQL Server 是通过在整个事务期间给读取的记录加锁实现这种隔离级别的,这样,在这个事务结束前,其他会话不能修改事务中读取的记录,而只能等待事务结束,但是SQL Server不会阻碍其他会话向表中添加记录,也不阻碍其他会话修改其他记录。
Oracle与SQL的区别着信息技术的飞速发展,数据处理不仅在数量上要求越来越大,而且在质量上也要求越来越高。
Oracle数据库在大多数企业中受到广泛使用,而SQL Server数据库也因为和Windows的联系,在企业中的使用也是非常广泛。
操作系统的稳定对数据库来说是十分紧要的,在数据库可操作平台上,Oracle可在所有主流平台上运行,Oracle数据库采用开放的策略目标,它使得客户可以选择一种最适合他们特定需要的解决方案。
客户可以利用很多种第三方应用程序、工具。
对开发商来说是很大的支持。
而SQL Server却只能在Windows上运行了,这个就显得比较单调了,但SQL Sever在Window平台上的表现,和Wind ows操作系统的整体结合程度,使用方便性,和Microsoft开发平台的整合性都比Oracle强的很多。
但Windows操作系统的稳定性及可靠性大家是有目共睹的,再说Microsoft公司的策略目标是将客户都锁定到Windows平台的环境当中,只有随着Windows性能的改善,S QL Server才能进一步提高。
从操作平台这点上Oracle是完全优胜于SQL Server的了。
从资料上可以看到,Oracle的安全认证获得最高认证级别的ISO标准认证,而SQL Server并没有获得什么安全认证。
这方面证明了Oracle的安全性是高于SQL Server的。
购买一个产品,首先考虑的当然是产品的性能了,当考虑性能的同时当然少不了究竟要花多少钱在这产品也是个很关键的问题。
要建立并运行一个数据库系统。
不仅仅包含最初购置软件、硬件的费用,还包含了培训及以后维护的费用。
Orcale数据库的价格是远比SQL Server数据库要高,为什么Oracle数据库比SQL Serve r数据库价格上要高出那么多,一方面Oracle的初始花费相对较高,特别是在考虑工具软件的时候,Oracle很多工具软件需要另外购买,与Microsoft提供免费的SQL Server工具软件相比,Oracle更显价格的不菲。
SQL server和oracle这两个数据库有什么区别?首先这两个都是关系型数据库,都数据经常使用的数据库。
Oracle是排名第一的,从使用广度和并发性性能方面,SQL server排名第三。
它们的区别:1.应用平台的角度:Oracle可以运行在任何平台,像Window,Linux,MarOS 上。
SQL server主流的支持平台是Windows,因为它背后的靠山就是Microsoft.从2017版开始,SQL server也开始跨平台,你可以下载它的Docker版本,就可以运行在Linux和MarOS上。
2.从优化的角度:比如查询优化,Orcale支持*的查询优化,SQL server是没有这个操作的。
从更新的角度,Orcale更新一个字段后需要执行commit提交以后才能更新,而SQL server 不需要commit,它的值已经改变了。
从回滚的角度,Orcale 可以在事务执行中支持回滚,而SQL server不允许,只有事务执行完了,发生失败或发生意外,才执行rollback这个功能。
另外就是Schema的区别,Orcale中一个instance有多个Schema,对于Orcale来说,Schema相当于数据库的概念,对于SQL server来说,一个数据库中可以有多个Schema,所以这个Schema相当于table的概念。
3.从备份的角度说,Orcale支持差分备份,而SQL server不支持,像增量级的,完整的文件级的备份这两个数据库都是支持的。
4.从触发器的角度说,Orcale支持前触发器和后触发器,SQL server只支持后触发器。
最后就是从付费的角度考虑,两者都有开源的版本,可供下载使用。
以上就是两者的区别,希望对你有所帮助。
sql与oracle 事务的区别.txt36母爱是一缕阳光,让你的心灵即便在寒冷的冬天也能感受到温暖如春;母爱是一泓清泉,让你的情感即使蒙上岁月的风尘仍然清澈澄净。
三.事务隔离级别
在SQL92标准中,事务隔离级别分为四种,分别为:Read Uncommitted、Read Committed、Read Repeatable、Serializable,其中Read Uncommitted与Read Committed为语句级别的,而Read Repeatable与Serializable是针对事务级别的。
在Oracle和SQL Server中配置事务隔离级别的语句是相同的,都运用 SQL92标准语法,即:
Set Transaction Isolation Level Read Committed
上面示例中的Read Committed可以被替换为其他三种隔离级别中的任意一种。
1.SQL Server中的隔离级别及实现机制
在SQL Server中提供了所有这四种隔离级别。
下面我们讨论在SQL Server中,这几种隔离级别的意思及其实现方式。
Read Uncommitted:一个会话可以读取其他事务未提交的更新结果,如果这个事务最后以回滚结束,这时的读取结果就可能是不正确的,所以多数的数据库运用都不会运用这种隔离级别。
Read Committed:这是SQL Server的缺省隔离级别,配置为这种隔离级别的事务只能读取其他事务已经提交的更新结果,否则,发生等待,但是其他会话可以修改这个事务中被读取的记录,而不必等待事务结束,显然,在这种隔离级别下,一个事务中的两个相同的读取操作,其结果可能不同。
Read Repeatable:在一个事务中,如果在两次相同条件的读取操作之间没有添加记录的操作,也没有其他更新操作导致在这个查询条件下记录数增多,则两次读取结果相同。
换句话说,就是在一个事务中第一次读取的记录保证不会在这个事务期间发生改动。
SQL Server 是通过在整个事务期间给读取的记录加锁实现这种隔离级别的,这样,在这个事务结束前,其他会话不能修改事务中读取的记录,而只能等待事务结束,但是SQL Server不会阻碍其他会话向表中添加记录,也不阻碍其他会话修改其他记录。
Serializable:在一个事务中,读取操作的结果是在这个事务开始之前其他事务就已经提交的记录,SQL Server通过在整个事务期间给表加锁实现这种隔离级别。
在这种隔离级别下,对这个表的所有DML操作都是不允许的,即要等待事务结束,这样就保证了在一个事务中的两次读取操作的结果肯定是相同的。
2.Oracle中的隔离级别及实现机制
在Oracle中,没有Read Uncommitted及Repeatable Read隔离级别,这样在Oracle 中不允许一个会话读取其他事务未提交的数据修改结果,从而防止了由于事务回滚发生的读取不正确。
Oracle中的Read Committed和Serializable级别,其意思与SQL Server类似,但是实现方式却大不一样。
在Oracle中,存在所谓的回滚段(Oracle9i之前版本)或撤销段(Oracle9i版本),Oracle 在修改数据记录时,会把这些记录被修改之前的结果存入回滚段或撤销段中,就是因为这种机制,Oracle对于事务隔离级别的实现与SQL Server截然不同。
在Oracle中,读取操作不会阻碍更新操作,更新操作也不会阻碍读取操作,这样在Oracle中的各种隔离级别下,读取操作都不会等待更新事务结束,更新操作也不会因为另一个事务中的读取操作而发生等待,这也是Oracle事务处理的一个优势所在。
Oracle缺省的配置是Read Committed隔离级别(也称为语句级别的隔离),在这种隔离级别下,如果一个事务正在对某个表执行 DML操作,而这时另外一个会话对这个表的记录执行读取操作,则Oracle会去读取回滚段或撤销段中存放的更新之前的记录,而不会象SQL Server一样等待更新事务的结束。
在Serializable隔离级别(也称为事务级别的隔离),事务中的读取操作只能读取这个事务开始之前已经提交的数据结果。
如果在读取时,其他事务正在对记录执行修改,则Oracle 就会在回滚段或撤销段中去寻找对应的原来未经修改的记录(而且是在读取操作所在的事务开始之前存放于回滚段或撤销段的记录),这时读取操作也不会因为相应记录被更新而等待。