会话与事务
如果一个会话断开和数据库的连接,而没有使用commit或rollback终止当前事务,那么该事务会自动被数据库撤销(roll back)
在您退出Sql*Plus时,会自动发出一条commit命令
在您退出Sql*Plus时,会自动发出一条commit命令
事务由一系列SQL语句组成,一个事务就是一个整体成败的单元
事务的结束方式有两种:提交和回滚
事务控制语句
Commit 完成事务,数据修改成功并对其他用户开放
Rollback 撤消事务,撤消所有操作
SAVEPOINT 设置回滚点
Rollback to savepoint 撤消在设置的回滚点以后的操作
Commit 完成事务,数据修改成功并对其他用户开放
Rollback 撤消事务,撤消所有操作
SAVEPOINT 设置回滚点
Rollback to savepoint 撤消在设置的回滚点以后的操作
在启动一个块时,不代表该事务被启动了。事务的开始不需要和块的开始相一致
锁的概念
锁用来锁定相关资源,锁归事务所有
锁是数据库用来控制共享资源并发访问的机制
锁用于保护正在被修改的数据
在事务开始或开始后的某一时刻,事务依情况取得相应的锁,直到事务结束事务所持有的所有的锁才被释放
锁用来锁定相关资源,锁归事务所有
锁是数据库用来控制共享资源并发访问的机制
锁用于保护正在被修改的数据
在事务开始或开始后的某一时刻,事务依情况取得相应的锁,直到事务结束事务所持有的所有的锁才被释放
锁定的优点
并行性 -允许多个用户访问同一数据
一致性 - 一次只允许一个用户修改数据
完整性 - 为所有用户提供正确的数据。如果一个用户进行了修改并保存,所做的修改将反映给所有用户
锁的分类:
行级锁:对正在被修改的行进行锁定。其他用户可以访问除被锁定的行以外的行
顾名思义行锁不会锁住整张表,它仅锁住相关行。行锁都是排它的。
一般的查询语句如select ... from ...语句影响的行不会被锁住
但select ... from ... for update语句影响的行会被行级排它锁住。其他事务只能查询这些数据行,不能进行update、delete或select...for update操作
insert / update / delete ...语句影响的行会被行级排它锁住。其他事务只能查询这些数据行,不能进行update、delete或select...for update操作。
表级锁
锁定整个表,限制其他用户对表的访问
--->表级共享锁LOCK TABLE <table_name> IN SHARE MODE
该语句将在<table_name>上设置表级共享锁。该锁设置之后,其他事务仅能查看<table_name>表,不能增、删、改
并行性 -允许多个用户访问同一数据
一致性 - 一次只允许一个用户修改数据
完整性 - 为所有用户提供正确的数据。如果一个用户进行了修改并保存,所做的修改将反映给所有用户
锁的分类:
行级锁:对正在被修改的行进行锁定。其他用户可以访问除被锁定的行以外的行
顾名思义行锁不会锁住整张表,它仅锁住相关行。行锁都是排它的。
一般的查询语句如select ... from ...语句影响的行不会被锁住
但select ... from ... for update语句影响的行会被行级排它锁住。其他事务只能查询这些数据行,不能进行update、delete或select...for update操作
insert / update / delete ...语句影响的行会被行级排它锁住。其他事务只能查询这些数据行,不能进行update、delete或select...for update操作。
表级锁
锁定整个表,限制其他用户对表的访问
--->表级共享锁LOCK TABLE <table_name> IN SHARE MODE
该语句将在<table_name>上设置表级共享锁。该锁设置之后,其他事务仅能查看<table_name>表,不能增、删、改
<table_name>表,其他事务可同时放置表级共享锁于<table_name>表上。
--->表级排它锁LOCK TABLE <table_name> IN EXCLUSIVE MODE
表级排它锁与表级共享锁非常相似,但每次只有一个用户可以在表中放置排它锁,却可以有多个用户同时在同一个
--->表级排它锁LOCK TABLE <table_name> IN EXCLUSIVE MODE
表级排它锁与表级共享锁非常相似,但每次只有一个用户可以在表中放置排它锁,却可以有多个用户同时在同一个
表中放置共享锁。
事务阻塞 :
当A事务锁住了某种资源,而同时B事务发出对这种资源的修改语句,则B事务将会被阻塞
我们可规定等待他事务释放锁的等待时间,如:
select ... from ... for update wait 10; ------将会等待10秒
LOCK TABLE table1 IN EXCLUSIVE MODE NOWAIT;
我们可规定等待他事务释放锁的等待时间,如:
select ... from ... for update wait 10; ------将会等待10秒
LOCK TABLE table1 IN EXCLUSIVE MODE NOWAIT;
死锁:
当两个事务相互等待对方释放资源时,就会形成死锁
Oracle会自动检测死锁,并通过结束其中的一个事务来解决死锁
右边是一个死锁的例子
转载于:https://blog.51cto.com/youxue/49557