Oracle事务和锁机制
事务
1. 说明
一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退。
2.事务相关概念
1)事务的提交和回滚:COMMIT/ROLLBACK
2)事务的开始和结束
开始事务:连接到数据库,执行DML、DCL、DDL语句
结束事务: 1. 执行DDL(例如CREATE TABLE),DCL(例如GRANT),系统自动执行COMMIT语句
2. 执行COMMIT/ROLLBACK
3. 退出/断开数据库的连接自动执行COMMIT语句
4. 进程意外终止,事务自动rollback
5. 事务COMMIT时会生成一个唯一的系统变化号(SCN)保存到事务表
3)保存点(savepoint): 可以在事务的任何地方设置保存点,以便ROLLBACK
4)事务的四个特性ACID :
1. Atomicity(原子性): 事务中sql语句不可分割,要么都做,要么都不做
2. Consistency(一致性) : 指事务操作前后,数据库中数据是一致的,数据满足业务规则约束(例如账户金额的转出和转入),与原子性对应。
3. Isolation(隔离性):多个并发事务可以独立运行,而不能相互干扰,一个事务修改数据未提交前,其他事务看不到它所做的更改。
4. Durability(持久性):事务提交后,数据的修改是永久的。
5) 死锁:当两个事务相互等待对方释放资源时,就会形成死锁,下面章节详细分析
事务隔离级别
1 .两个事务并发访问数据库数据时可能存在的问题
1. 幻想读:
事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录并commit,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。
2. 不可重复读取:
事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录并commit,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。
3. 脏读:
事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。
2.oracle事务隔离级别
oracle支持的隔离级别:(不支持脏读)
READ COMMITTED--不允许脏读,允许幻想读和不可重复读 SERIALIZABLE--以上三种都不允许
sql标准还支持READ UNCOMMITTED (三种都允许)和 REPEATABLE READ(不允许不可重复读和脏读,只允许幻想读)
以上区别在下面章节事务建立,隔离级别分析中说明
以上内容引用自:http://www.cnblogs.com/wishyouhappy/p/3698152.html
1.什么是事务,事务的特性是什么?
原子性atomicity:语句级原子性,过程级原子性,事务级原子性
一致性consistency:状态一致,同一事务中不会有两种状态
隔离性isolation:事务间是互相分离的互不影响(这里可能也有自治事务)
持久性durability:事务提交了,那么状态就是永久的
悲观锁:
乐观锁:
1.利润表t_profit中有一个 version字段,当前值为1;而总资产余额字段(balance)为$10000
2.操作员A读出version=1,从总资产减除2000,10000-2000=8000.
3.A还没操作结束,此时操作员B也读出version=1,总资产减除5000,10000-5000=5000.
4.A操作完成,把version加1,修改为2,把总资产减2000后提交更新数据库,更新成功
SQL> select * from t_book; BOOKID BOOKNAME PUBLISH
------ -------------------------------------------------- --------------------------------------------------
1 OracleTestForMine ShenZhenPublish
2 JavaOKa JiXieGongYePublish SQL> savepoint a1; Savepoint created SQL> delete from t_book where bookid=''; 1 row deleted SQL> select * from t_book; BOOKID BOOKNAME PUBLISH
------ -------------------------------------------------- --------------------------------------------------
1 OracleTestForMine ShenZhenPublish SQL> rollback to a1; Rollback complete SQL> select * from t_book; BOOKID BOOKNAME PUBLISH
------ -------------------------------------------------- --------------------------------------------------
1 OracleTestForMine ShenZhenPublish
2 JavaOKa JiXieGongYePublish
最新文章
- 如何获取Iframe的页面控件的值
- 8UFTP
- JavaScript判断鼠标滑轮是向下还是向上滚动
- C++对MS SQL Server的操作
- Shell 是个什么玩意
- bzoj 1432 [ZJOI2009]Function(找规律)
- (转载)C++中将构造函数或析构函数定义为private
- IOS中用模型取代字典的好处
- G - MPI Maelstrom
- win8下nodejs安装配置记录
- SQL拼接方法
- (NO.00001)iOS游戏SpeedBoy Lite成形记(十三)
- 网络编程-SOCKET开发之----2. TCP粘包现象产生分析
- 【使用指南】ComponentOne Enterprise .NET开发控件集
- session的部分理解
- Codeforces.24D.Broken robot(期望DP 高斯消元)
- linux存储管理之自动挂在
- js之原型,原型链
- Unity NavMesh导航网格 初级教程
- js my_first
热门文章
- SpringBoot 获取前端页面参数的集中方式总结
- jQuery-对Select的操作集合[终结篇]
- sklearn解决分类问题(KNN,线性判别函数,二次判别函数,KMeans,MLE,人工神经网络)
- VS2012使用正则删除空行
- Flea Circus(Project Euler 213)
- Django admin 的 9 个技巧
- Jmeter JDBC执行多条SQL
- Android中Bitmap、Drawable、byte[]转换
- 带jsk证书,请求https接口
- 推荐10 个短小却超实用的 JavaScript 代码段