数据库:事务隔离级别,grap锁
浏览量:395
数据库的特性
原子性:事务内,处理数据要么全部成功,要么全部失败
一致性:处理数据前和后,都是一致;例子:假设A和B的钱加起来是5000,不管A和B之间如何转账,转几次账,事务结束钱相加起来应该还得是5000,这就是事务的一致性。
持久化:一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作
隔离性:多个用户并发访问数据库时,操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
B.事务的隔离性产生的几种问题
1)、脏读
数据在处理的过程中,查询了未提交的事务的数据。
例子:
出现上述情况,即我们所说的脏读 ,两个并发的事务,“事务A:转账”、“事务B:取钱”,事务B读取了事务A尚未提交的数据。
解决方案:
如果事务在更新和插入的时候不允许别人去查询,就避免这个事情发生
2)、不可重复读
事务a读取数据库中的数据后,事务b更新了该数据,当事务a再次读取该数据时,就会发现数据已经发生了改变
例子:
一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。
解决方案:
如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。
3)、幻读
事务非独立执行时发生的一种现象。
例子:
A事务读取B事务提交的新增数据,会引发幻读问题。幻读一般发生在计算统计数据的事务中。
4)、第一类更新丢失
A事务撤销时,把已经提交的B事务的更新数据覆盖了
例子:
这时候取款事务A撤销事务,余额恢复为1000,这就丢失了更新。
2)、第二类数据更新丢失
为了解决上述问题,数据库通过锁机制解决并发访问的问题。根据锁定对象不同:分为行级锁和表级锁;根据并发事务锁定的关系上看:分为共享锁定和独占锁定,
为了更改数据,数据库必须在进行更改的行上施加行独占锁定,insert、update、delete和selsct for update语句都会隐式采用必要的行锁定。
但是直接使用锁机制管理是很复杂的,基于锁机制,数据库给用户提供了不同的事务隔离级别,只要设置了事务隔离级别,数据库就会分析事务中的sql语句然后自动选择合适的锁。
共享锁定:会防止独占锁定但允许其他的共享锁定。
独占锁定:既防止共享锁定也防止其他独占锁定。
C.事务的隔离级别
级别1:读取未提交(Read uncommitted),这种并发性最高,但会导致上述问题
级别2:读取已提交(Read committed),这是oracle的默认隔离级别
级别3:可重复读(Repeatable read)
级别4:串行(Serializable),这种隔离级别最高,但数据库并发会受到很大的限制,可以避免上述问题,但项目中不会采用
神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。