`
yun342173024
  • 浏览: 73816 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据库事物乐观锁和悲观锁

 
阅读更多
数据库事物单个逻辑单元工作执行的一系列操作,就是一些sql语句,也可以是多条,一个update操作就是一个事物。
事物具有四种特性
1.原子性
   事物必须是原子工作单元,要么都执行成功(也就是说所有的sql语句都执行成功),要么都不执行(所有的sql语句都不执行)。
2. 一致性
  事务在完成时,必须使所有的数据都保持一致状态。
3.隔离性
  允许多个用户对数据进行并发访问,而不破环数据的完整行和正确性,同时,并发事物的修改必须与其他并发事物隔离,一般是通过加锁实现。 
4.持久性
  事物完成后,数据必须永久的保存到数据库中。

事物并发访问如果不设置事物的隔离级别,就会带来如下问题
1.脏读 读取了其他事物未提交的数据,一个事物修改了某条数据还未提交,一个事物读取了这条数据,而修改的事物由于某种原因失败会滚了,这个时候读取事物就读到了脏数据。
2.不可重复读
   一个事物两次读取某条数据,但读取的结果不一样,在第二次读取的时候其他实物修改了这条数据。
3.幻读
  一个事物两次读取,读取到了其他事物插入到数据中的数据。
针对以上情况,数据库提供了四种事物的隔离级别来解决事物并发带来的问题。
1.读未提交(read uncommited)
  写事物会阻塞写事物,但不会阻塞读取事物,因此不能解决读取脏数据,读取事物不会阻塞其他事物,这中隔离级别不能解决上面任何问题。
2 读已经提交(read commited)
  写事物会阻塞写事物和读取事物,因此可以避免读取脏数据,但读取事物不会阻塞写事物,不能解决可重复度去的问题。
3 可重复读(Repeatable read)
  读事物会阻塞写事物和读事物,因此可以重复读,但其他事物可以进行插入操作,不能解决幻读的问题。
4 序列化(Serializable)
   事物必须一个一个的执行 ,可以解决上面的问题,但事物基本没有并发性。
事物的并发控制
当多个人并发修改同一条数据时,必须实现一个控制系统,使一个人的修改不会对其他人的修改造成负面影响。
乐观锁和悲观锁控制并发
1.乐观锁
  乐观的认为其他用户企图访问和更改你正在访问的对象的概率很低,即使有,大不了从来一次,对在做一次的开销不是很大的情况下,如果开销很大则必须使用悲观锁.乐观锁的实现需要在程序中控制,可以通过加一个数据版本号来控制比如两个事物都读取了同一条记录要进行更新
 select *  from person 
 select *  from person
 update person set name='xiaoming',version=version+1 where id='1'
 and version=0;  
 这个更新语句会执行失败,因为找不到版本好为0的数据,第一个事物已经更新了 
update person set name='xiaoming',version=version+1 where id='1'
 and version=0;

如果实物的隔离级别设置为读已提交,使用乐观锁并能解决可重复度,系统要允许不可重复读取。
悲观锁
很悲观的认为其他用户访问和更改你正在访问或修改的对象的概率和高,悲观锁的实现是通过加锁来实现的,当要更改数据前就加锁,别的事物不能操作,sql语句如下
   select * from person for update
   update person set name='ff' where id='1'

直到上面事物提交,才能释放锁,其他事物才能操作。悲观锁的并发性会降低。因此大多数情况下,使用乐观锁来实现并发修改。




分享到:
评论

相关推荐

    C# 数据库并发事物.doc

    总结来说,C#数据库并发事物处理涉及到对并发问题的理解、选择合适的锁机制(乐观锁或悲观锁)以及设定适当的数据库隔离级别。通过这些技术,开发者可以有效地解决多用户环境下的数据冲突,保证系统的稳定性和数据的...

    数据库基础知识.docx

    "数据库基础知识" 数据库基础知识是指数据库系统的基本概念和原则,它是数据库管理系统的核心组件。数据库系统是指用于存储、管理和检索数据的...锁与并发关系较大,包括乐观锁、悲观锁、行锁、表锁、读锁和写锁等。

    v512工作室_张利国_Java高端培训系列教材_Oracle实用教程_01章_数据库基础

    常见的并发控制机制有锁定机制、乐观锁和悲观锁等。 - **备份与恢复**:定期备份数据库,以防数据丢失。恢复机制用于在数据损坏或丢失时恢复数据到正常状态。 #### 4. 结论 通过对数据管理的基本概念和发展历程的...

    数据库知识要点

    - 乐观锁与悲观锁:不同的并发控制策略。 - 事务日志:记录事务执行过程中的变更信息,用于恢复。 3. **死锁与活锁**: - 死锁:两个或多个事务相互等待对方释放资源而无法继续执行的状态。 - 活锁:某个事务...

    分布式事物案例demo用到的数据库与数据表

    因此,一些系统选择使用乐观锁或悲观锁策略,或者采用分布式事务协调器如Zookeeper、Kafka等来优化性能和容错性。 总之,分布式事务是确保分布式系统数据一致性的核心机制。通过理解各种分布式事务模型和技术,结合...

    DB事物案例

    7. **乐观锁与悲观锁**: - **乐观锁**:假设很少发生并发冲突,只在提交时检查是否冲突。常见实现方式为版本号机制或时间戳。 - **悲观锁**:在读取数据时立即加锁,防止其他事务修改,直到事务结束才释放锁。SQL...

    四级数据库工程师笔记.docx

    - **并发控制机制**:掌握锁机制、乐观锁和悲观锁的区别及应用场景。 - **死锁处理**:了解死锁产生的原因及预防和解决死锁的方法。 #### 六、数据库管理与维护 - **数据完整性**:掌握保证数据完整性的机制,如...

    SQL server 中锁机制详解

    锁机制可以分为悲观锁和乐观锁两种。 悲观锁是一种保守的锁机制,为任何操作(即使是 select)锁定资源,前提是假定用户冲突和回滚的可能性极大。乐观锁是在数据变化时才加锁,并发性高,前提是假定用户冲突是很小...

    桂林电子科技大学复试2014数据库系统原理+程序设计基础考研复试试题研究生入学考试试题考研复试真题.pdf

    为了保证并发调度的正确性,可以采用多种并发控制机制,如锁机制(包括乐观锁和悲观锁)、时间戳排序等。 #### 关系代数与SQL查询 关系代数是数据库查询语言的基础,它包括选择、投影、连接、除法等基本操作。在SQL...

    linq 并发事物,进阶资料

    LINQ提供了并发控制机制来解决这个问题,它主要依赖于乐观并发和悲观并发策略。 - **乐观并发**:默认情况下,LINQ使用乐观并发,假设冲突不会发生。当一个事务提交时,LINQ会检查数据是否已被其他事务修改,如果...

    地理信息系统数据库的复习大概资料

    - **外模式**(子模式或用户模式):是模式的子集,是数据库用户能够看见和使用的局部数据的逻辑结构和特征描述。 - **内模式**(存储模式):是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。 2....

    事物体系,看不懂你打我

    乐观锁通常用于防止库存超卖等问题,它假设并发事务不会冲突,并在提交时检查是否发生冲突。悲观锁则在事务开始时就锁定相关的数据,以防止其他事务修改。InnoDB引擎支持行级锁、表级锁和间隙锁,以提高并发性能。在...

    6种分布式事务最终一致性解决方案,一次性说清.docx

    例如乐观锁和悲观锁策略,适用于高并发场景。 在设计分布式事务时,我们需要关注系统的高可用性、数据的最终一致性、服务的独立演化和部署能力,以及对异构数据存储的支持。同时,低侵入性和对同步/异步流程的支持...

    sqlserver中的事务和锁详细解析

    - 从编程角度,分为悲观锁和乐观锁。 - 悲观锁:预先假设数据会被修改,所以在读取数据时立即加锁,保证数据在处理过程中不会被其他事务改变。 - 乐观锁:假设数据通常不会被修改,只有在更新数据时才检查是否被...

    Oracle并行性完整性一致性总结报告

    - 对敏感操作使用乐观锁或悲观锁。 - 使用MVCC(多版本并发控制)技术。 #### 四、事务概念操作以及SCN机制 **4.1 事务的概念** 事务是数据库操作的基本单位,它可以是一系列的SQL命令,这些命令要么全部成功执行...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【数据库】乐观锁与悲观锁的区别 107 【数据库】数据库的三范式 107 【数据库】inner/left/right/full join的区别 109 【数据库】哪些字段该添加索引,哪些不添加? 109 【数据库】分页查询语句怎么写? 110 Mysql...

Global site tag (gtag.js) - Google Analytics