Oracle学习笔记(事务知识点)第2篇
我就直接po截图和代码了,下面有具体的截图演示事务处理和死锁的情况
/*
Oracle学习笔记(事务知识点)
事务处理:所谓的事务处理其实就是保证数据操作的完整性,所有的操作要
么同时成功,要么同时失败
事务的4个特性:ACID
原子性 Atomicity
一致性 Consistency
隔离性 Isolation
持久性 Durability
事务主要有2个命令
提交 commit
回滚 rollback
在oracle中,对于每一个连接到数据库的窗口(sqlplus)或
者其他第三方软件工具(PLSQL Developer、Navicat Premium),在连接之后,实
际上都会与数据库的连接建立一个session会话(即每一个连接到数据库上的用户都表示创
建了一个session会话)
一个session会话对数据库所做的修改,不会立刻反映到数据库的真实数据上,这是允
许回滚的,当一个session会话提交了所有的操作之后,数据库才真正的做了修改
注意:如果数据被提交了,则肯定无法回滚
在oracle数据库中的事务的隔离级别有read committed 和serializable
在Mysql数据库中事务的隔离级别有read-uncommitted(读未提交)、read-committed(不可重复读)、
repeatable-read(可重复读)、serializable(串行化)这4种
我们在事务中,可以设置保存点,删除保存点,回滚部分事务,回滚全部事务
在oracle数据库中,有一个死锁的概念
比如:多个session会话都在操作同一条记录
死锁:一个session会话如果更新了数据库中的某条记录,此时,其他session会
话也在更新该条记录,那么其他session会话是无法立刻更新的,需要等
待对方commit提交了之后才允许更新
如果两个事务,分别锁定一部分数据,而都在等待对方释放锁才能完成事务操作,这
种情况下就会发生死锁
*/
/*
我使用Navicat Premium这个软件工具,默认是自动提交事务
而我使用PLSQL Developer这个软件工具,默认是不自动提交事务
PL/SQL Developer这个软件工具可以自己设置自动提
交事务,在工具-> 首选项 -> 窗口类型 -> SQL窗口 -> 勾选“自动提交sql”
英语界面:Tools -> Preferences -> Window Types -> SQL Window:勾选“AutoCommit SQL”
在Oracle中可以使用set autocommit on;和set autocommit off;这2个命
令设置是否自动提交事务
但是需要注意:set autocommit off;和set autocommit on;这2句话,在PLSQL Developer这个软
件工具和在Navicat Premium这个软件工具中执行都会报错,但是在sqlPlus窗口中输
入set autocommit off;和set autocommit on;这2句话是OK的,有效的
在Mysql中
1.开启自动提交事务:set autocommit = 1;
2.关闭自动提交事务:set autocommit = 0;
3.查看:show variables like '%autocommit%';
在Oracle中
1.开启自动提交事务:set autocommit on;
2.关闭自动提交事务:set autocommit off;
*/
--查询数据
SELECT * FROM emp;
--删除数据
DELETE FROM emp WHERE empno = 7788;
--查询数据
SELECT * FROM emp;
/*
后面有时间的话,写个事务的具体案例
事务:所谓的事务处理其实就是保证数据操作的完整性,所有的操作要么同时成功,要么同时失败
银行转帐的例子是最经典的事务案例,后面有时间的话,会写写这个案例
*/
在Oracle数据库中,设置是否自动提交事务如下:
set autocommit off; 关闭自动提交事务
set autocommit on; 开启自动提交事务
如下图:在sqlPlus窗口中,使用set autocommit off;和set autocommit on;这2句话是OK的,有效的,但
是这2句话在PLSQL Developer这个软件工具和在Navicat Premium这个软件工具中执行都会报错,大家可以理解成这些第三方软件工具是在sqlPlus的基础上包了一层,所以这些第三方软件工具自然和sqlPlus有些不一样了,意思就是说,这些第三方软件工具在sqlPlus的基础上包了一层之后,有些命令和设置,不让你自己轻易修改和设置了。
下面演示事务处理
DELETE FROM emp WHERE empno = 7698;
执行删除sql语句后,我们再重新查了一下emp表,如下:好像确实删除了编号为7698的这条数据
我们可以再开一个客户端,查看emp表,看看编号为7698的这条数据是否真的删除了,那我们就用PLSQL Developer这个软件工具查emp表吧,可以把PLSQL Developer这个软件工具理解成另一个客户端B如下:
此时,我们在客户端A,提交事务,看下会有什么效果
此时,我们再在PLSQL Developer这个软件工具查看emp表
以上演示的是一个事务处理的小案例
接下来,演示一个死锁的案例
此时,我们把客户端A提交(commit)一下,看下是什么效果