首页 > 经验记录 > 数据库 > 事务处理、锁 的使用

事务处理、锁 的使用

事务处理

事务处理在数据库开发中有着非常重要的作用

核心概念就是指一个SESSION所进行的所有更新要么一起成功要么一起失败

SESSION值得是会话,每一个连接到服务器上的用户都通过SESSION表示,服务器依靠SESSION区分不同的用户,在所有的开发之中,会话都表示的是用户。

 

Oracle中事务操作命令

No. 命令 描述
1 SET AUTOCOMMIT=OFF 取消掉自动提交处理,开始事务处理
2 SET AUTOCOMMIT=NO 打开自动提交处理,关闭事务处理
3 COMMIT 提交事务
4 ROLLBACK TO[回滚点] 回滚操作
5 SAVEPOINT 事务保存点名称 设置事务保存点

所有的命令,每一个SESSION全都具备。

 

对于每一个SESSION而言,每一个数据库的更新操作在事务没有被提交之前都只是暂时保存在了一段缓冲区之中,并不会真正的向数据库中发出命令,如果有用户发现操作有问题了,则可以进行事物的回滚。

在执行完更新操作之后通过COMMIT提交了事务,那么就表示真正的发出了更新指令。

如果但是在没有更新前,执行了ROLLBACK回滚操作,那么会回到原点上。在默认情况下执行ROLLBACK命令意味着全部的操作都要回滚,所以为了操作方便,提供了保存点(SAVEPOINT),这样在回滚的时候,就可以通过ROLLBACK回到指定的保存点上

 

在默认的情况下,所有的事物都不属于自动提交,必须由用户自己手动提交,如果希望自动提交,每执行一个原子性操作,那么就自动提交事务。可以使用SET AUTOCOMMIT=NO

 

实际上所谓的锁就是指不同的SESSION同时操作了同一资源所发生的问题

列如:

第一个SESSION操作:   SELECT * FROM emp WHERE deptno=10 FOR UPDATE;

第二个SESSION操作:   SELECT * FROM emp WHERE deptno=10 FOR UPDATE;

此时第二个SESSION执行语句不会有任何事情发生,只能在那等待,在第一个SESSION使用ROLLBACK回滚时,第二个会立马显示出查询效果,第一个再次执行同样的语句时也只能等待

 

上锁后使其只能被一个SESSION操作,其他的SESSION执行操作被锁定的目标时只能等待,就像上厕所一样,进去的人把门锁了,必须要等他出来,外面的人才能进去

 

在Oracle中的锁有以下两种基本类型:

         行级锁(又称为记录锁定):对当前事务中的一行数据以独占的方式进行锁定,在此事务结束之前,其他事物要一直等待该事物完结,列如上边码的例子就是行级锁定

         表级锁:对整张数据表进行锁定,只允许当前事务访问数据表,其他事务无法访问

 

 

行级锁定

         用户执行了INSERT、UPDATE、DELETE以及SELECT FROM UPDATE语句时,Oracle将隐式的实现记录的锁定,这种锁定被称为排它锁

这种锁的主要特点是:当一个事物执行了相应的数据操作之后,如果此时事物没有提交,那么会一直以独占的方式锁定这些操作的数据,其他事物一直到此事务释放锁后才可以进行操作。

比如:有俩SESSION使用UPDATE更新同一行记录,那么第二个SESSION也会出现锁的情况

 

         表级锁定

         标记锁定需要用户明确的使用“LOCK TABLE”语句手工进行锁定

语法: LOCK TABLE 表名称|视图名称,表名称|视图名称,… IN 锁定模式 MODE[NOWAIT]

NOWAIT这是一个可选项,当视图锁定一张数据表时,如果已发现被其他事务锁定,不会等待

 

锁定模式有如下几种常见模式:

ROW SHARE行共享锁,在锁定期间允许其他事务并发对表进行各种操作,但不允许任何事务对同一张表进行独占操作(禁止排它锁)

ROW EXCLUSIVE行排它锁,允许用户进行任何操作,与行共享锁不同的是它不能防止别的事务对同一张表进行手工锁定或独占操作

SHARE共享锁,其他事物只允许执行查询操作,不能执行修改操作

SHARE ROW EXCLUSIVE共享排它锁,允许任何用户进行查询操作,但不允许其他用户使用共享锁,之前所用的“SELECT FOR UPDATE”就是共享排它锁的常见应用

EXCLUSIVE排它锁,事务将以独占方式锁定表,其他用户允许查询,但是不能够修改,也不能设置任何的锁

 

 

锁这个东西,一般出现的较少,了解一下就行

 

 

 


EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00