数据库事务由以下几部分组成
DML语句,建立数据改变的一致性
DDL语句
DCL语句
以第一个DML SQL语句执行开始
以下面的事件为止
COMMIT或者ROLLBACK语句被执行
一个DDL或者DCL语句执行(自动提交)
用户退出SQL*Plus
系统崩溃
COMMIT和ROLLBACK语句的优点
确保数据一致
在做永久改变之前可以预览数据改变
组逻辑上的相关操作
提交数据
进行改变
DELETE FROM employees WHERE employee_id = 99999;
INSERT INTO departments VALUES (290,’Corporate Tax’,NULL,1700);
提交改变
COMMIT;
在COMMIT之后的数据状态
数据库中数据的改变被永久化不会丢失,即使系统崩溃。
事务结构,旧事务状态被清除,新事务开始。
旧事务中的锁定的行被释放,这些行现在可以被其它用户进行操作。
在Rollback之后数据的状态
使用ROLLBACK命令放弃所有未决的改变
数据的改变被撤回
数据先前的状态被还原
受影响行上面的锁被释放
隐式事务处理
在下列环境下自动提交会发生
— DDL语句被执行
— DCL语句被执行
— 从SQL*Plus中的正常退出,没有显式执行COMMIT或者ROLLBACK语句
在SQL*Plus非正常结束或者系统失败,自动回滚发生。
读提交
事务独立方式
----读提交 readcommitted
事务中读取其它对话已提交的数据。
----连续读 serializable
事务中读取的数据保持一致性。
锁
在并发事务间防止破坏性的交互操作
需要没有用户动作
自动使用最低级别的限制
处理事务期间上锁
事务结束时,锁自动释放
锁类型
锁的类型
DDL锁
DML锁
TM表锁
TX行锁
锁模式
锁的模式
rowshared RS 2
rowexclusive RX 3
shared S 4
sharedrow exclusive SRX 5
exclusive X 6
注:
TM:RS RX S SRX X
TX:X
在TX锁前先获得TM锁
锁模式相容性
| RS | RX | S | SRX | X |
RS | T | T | T | T | F |
RX | T | T | F | F | F |
S | T | F | T | F | F |
SRX | T | F | F | F | F |
X | F | F | F | F | F |
DML操作与锁
SELECT 语句不需要获得锁
SELECT FOR UPDATE语句获得TM:RS,TX:X
INSERT DELETE语句获得TM:RX,TX:X。在外键参考的表上获得TM:RS锁
UPDATE 句获得TM:RX,TX:X。所果修改的是外键,则参考的表上获得TM:RS锁
用户使用LOCK TABLE IN …获得其它的锁
[ROW] SHARE, [[SHARE] ROW] EXCLUSIVE, SHAREUPDATE