事务
指将一系列对数据库的操作看做一个整体,要么全部被执行,要么都不执行。利用事务,可以保证数据的完整性。
事务四个特性(ACID特性)
原子性(Atomic):即不可分割性,此事务内对数据库的操作要么全部被执行,要么都不执行。如果事务内的操作全部执行成功,则所有的数据库操作被提交,数据库状态发生转换;如果事务内的某一操作失败,则其他操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。(出自*)
我的理解 : 如 A+B = 5,A = 2,B = 3, 当 A = 4 那么 B 必须等于1;
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行, (这个隔离的程度由事务的隔离级别决定)。
持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。
现象和事务的隔离级别
并发时,事务隔离级别不同造成的现象:脏读,不可重复读,幻读
脏读:一个事务读取另一个事务未提交的数据。
不可重复读:读取另一个事务已提交的数据,不可重复读另一个事务未提交前的数据。
幻读:对insert,不可重复读。
隔离级别
未授权读取(READ UNCOMMITTED) : 也称为读未提交,允许脏读取,事务可以看到其他事务“尚未提交”的修改。
授权读(READ COMMITTED) : 也称读已提交,允许不可重复读取,但不允许脏读取。(简而言之,授权读这种隔离级别保证了读到的任何数据都是提交的数据,避免读到中间的未提交的数据,脏读(dirty reads)。但是不保证事务重新读的时候能读到相同的数据,因为在每次数据读完之后其他事务可以修改刚才读到的数据。出自*)
可重复读(Repeatable reads) : 禁止不可重复读取和脏读取,但是可能出现幻读。
序列化(Serializable) : 在基于锁机制并发控制的DBMS实现可序列化要求在选定对象上的读锁和写锁保持直到事务结束后才能释放。在SELECT 的查询中使用一个“WHERE”子句来描述一个范围时应该获得一个“范围锁(range-locks)”。这种机制可以避免“幻影读(phantom reads)”现象。当采用不基于锁的并发控制时不用获取锁。但当系统探测到几个并发事务有“写冲突”的时候,只有其中一个是允许提交的。这种机制的详细描述见“‘快照隔离”。
注意 : 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
Oracle 有三种事务隔离级别 : 授权读(READ COMMITTED),可重复读(Repeatable reads) ,序列化(Serializable)
默认的隔离级别是 : 授权读(READ COMMITTED)。
设置事务隔离级别 :
SET TRANSACTION ISOLATION LEVEL [READ COMMITTED,SERIALIZABLE,REPEATABLE READ]
事务提交方式
自动提交(默认),手动提交.
设置事务提交方式 : SET AUTOCOMMIT ON/OFF
设置事务保存点 : SET SAVEPOINT aaa