一、事务
事务就是业务上的一个逻辑单元,它能够保证其中对数据所有的操作,要么全部成功,要么全部失败。
二、事务的特性:
1、原子性:事务是SQL中的最小执行单位,不能再进行分割。要么全部执行,要么全部不执行
2、一致性:在事务操作前和事务操作后,数据必须处于一致状态。
3、隔离性:事务之间是相互隔离的,多个事务不会相互影响。
4、持久性:当事务提交后,数据则永久有效。
读取事务异常:
1、脏读:一个事务读取了另一个事务未提交的数据。
2、不可重复读:一个事务再次读取之前曾经读取过的数据时,发现该数据已经被另一个已提交的事务修改。
3、幻读:一个事务根据相同的查询条件,重新执行查询,返回记录中包含了与前一次执行查询返回的记录不同的行。
事务的隔离级别:
ANSI SQL-92标准中定义的事务级别:
1、Read Uncommitted:最低等级的事务隔离,它仅仅保证了读取过程中不会取到非法数据。
2、Read Comitted:此级别的事务隔离保证了一个事务不会读到另一个并行事务已修改但未提交的数据,此级别的事务级别避免了”脏读“。
3、Repeatable Read:此级别的事务隔离避免了”脏读“和”不可重复读“异常现象的出现。一个事务不可能更新已经由另一个事务读取但未提交(回滚)的数据。
4、Serializable:最高等级的隔离级别,提供了最高等级的隔离机制,三种异常情况都能避免。该事务以串行执行的方式执行。
Oracle中提供的隔离级别:
1、Read Comitted:Oracle默认的隔离级别,此级别的事务保证了一个事务不会读到另一个并行事务已修改但未提交的数据,也就是说,此等级的事务避免了"脏读"。
2、Serializable:最高等级的隔离级别,提供了最高等级的隔离机制,三种异常情况都能避免。
3、Read Only:Read Only是Serializable的子集,指事务中不能有任何修改数据库中数据的语句(DML),以及修改数据结构的语句(DDL)。只允许读不允许改。
三、事务控制语句:
1、COMMIT:提交事务,对数据库的修改进行保存。
2、ROLLBACK:回滚事务,取消对数据库所做的修改。
3、SAVEPOINT:在事务中创建存储点。
4、ROLLBACK TO <SAVEPOINT>:将事务回滚到存储点。
5、SET TRANSACTION:设置事务的属性。
四、使用事务的步骤:
1、开启事务。在Oracle中,事务是在上一次事务结束以后,数据“第一次”被修改时自动开启。
2、进行(多次)数据操作(增、删、改)。
3、结束事务:事务结束有两种情况.
(1)事务被提交:
a.发出COMMIT命令。
b.执行DDL语句。如果DDL语句前面有DML语句,则Oracle会自动把前面的DML语句作为一个事务提交。
c.与Oracle断开连接,或退出PL/SQL Developer,事务会自动提交。
(2)数据被撤销:
a.发出ROOLBACK命令.
b.服务器进程异常结束。
c.DBA停止会话。
例:模拟银行转账:
--创建测试表,建立金额检查约束,必须大于0 CREATE TABLE ACCOUNT ( userid NUMBER CONSTRAINT pk_bid PRIMARY KEY, username VARCHAR2(20) NOT NULL, balance NUMBER(16,2) NOT NULL CONSTRAINT ck_balance CHECK(balance > 0) ) --插入测试数据 INSERT INTO ACCOUNT VALUES(1,'张三',3000); INSERT INTO ACCOUNT VALUES(2,'李四',1);
--银行转账事务 BEGIN UPDATE ACCOUNT SET balance = balance - 2000 WHERE userid = 1; UPDATE ACCOUNT SET balance = balance + 2000 WHERE userid = 2; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; END;
例:操作dept表:
INSERT INTO dept VALUES(50,'a',NULL); --插入两条记录 INSERT INTO dept VALUES(60,'b',NULL); SAVEPOINT a; --设置保存点 INSERT INTO dept VALUES(70,'c',NULL); --插入新的数据 ROLLBACK TO SAVEPOINT a; --回到保存点a,则保存点后的SQL语句失效。 select * FROM dept; --插入c的值没有了。 ROLLBACK; --回滚事务,插入的a和b的值也没有了。 SELECT * FROM dept;
总结:
⑴事务用于确保数据的一致性,由一组相关的DML语句组成,要么全部不执行,要么全部撤销。
⑵当执行事务操作时,Oracle会自动在作用的表上加锁,以防止其他用户锁定该表,同时也在行上加行级锁,以防止其它事务在相应行上执行DML操作。
⑶当执行事务提交或者回滚时,Oracle会确认事务变化或回滚事务、结束事务、删除保存点,释放锁。
⑷事务期间应避免与使用者交互。
⑸尽可能让事务持续时间越短越好。
⑹在事务中尽可能存取最少的数据量。
五、SET TRANSACTION
可以用来设置事务的属性,但是必须放在事务的第一条。可以设置3个属性。
1、设置事务的隔离级别。
1)SET TRANSACTION READ ONLY
2)SET TRANSACTION ISOLATION LEVEL READ COMMITTED
3)SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
2、规定回滚事务时所使用的存储空间。
3、对事务命名。
SET TRANSACTION NAME 'tname';