当处于高并发环境时,有可能多个事务同时作用于某步操作,这将导致事务在不同时间读取到的数据不一致或修改丢失等错误。
为了避免上述错误, 可采用如下策略:
使用完全隔离的事务
- serializable 使用完全隔离的事务,事务看起来像是一个接一个地执行。
- repeatable 保证每次读取相同的记录能得到相同的结果
- read commited 通常情况下,我们应该使用该隔离级别, 并结合使用乐观锁和悲观锁。
乐观锁
其原理就是事务在执行更新操作前先判断更新数据是否被修改。可以通过版本号、时间戳、对象状态等来判断是否已被修改。一般情况下,尽量使用版本号来判断,只在对老系统进行升级且无法使用版本号的前提下, 才会使用时间戳。
关于乐观锁,jdbc和ibatis需要用户自己单独实现。jdo和hibernate无需用户单独实现,只需要简单的配置就可以使用。
在如下情况下,不推荐使用乐观锁:
数据库模式不支持乐观锁(对老系统进行升级)
应用程序必须保证能够更新读取的记录
应用程序要求读取的一致性
悲观锁
悲观锁机制会假设更新冲突总会发生。所以不管冲突是否真的会发生,它都会枷锁。悲观锁能在一定程度上防止读取数据的不一致性。但当有insert操作时,读取结果可能不一致。
用法
select ... for update
补充:关于隔离级别,可以通过spring拦截器或jdbc datasource来实现。
通知并发更新
在业务层捕获/处理dao异常并不是一件明智的事,幸运的是,spring提供了一个扩展,能够自动翻译jdbc、hibernate、jdo抛出的数据访问异常。
但是,spring在处理此操作时有一个缺陷,就是spring无法出由oracle产生的部分错误识别码。如:ORA-00060 ORA-08177等。针对上述情况,我们可以通过扩展
SQLErrorCodeSQLExceptionTranslator来弥补。
使用jdo和hibernate处理并发更新
使用起来相对比较简单,只需做简单的配置,jdo/hibernate就可自动产生对应的sql语句。
用jdo处理并发更新
<version strategy="version-number" column="XXX"/>
或
<version strategy="timestamp" column="XXX"/>
或
<version strategy="stateimage" column="XXX"/>
hibernate 处理并发更新
使用乐观锁
<version name="version" clumn="XXX"/>
使用<class>元素的乐观锁属性来定义hibernate采用字段比较来实现乐观锁检查。
<class dynamic-update="true" optimistic-lock="dirty"...>
使用悲观锁
通过调用session.load() session.lock和query.setLockMode()这些方法,锁住对象对应的数据表里的记录。
从数据并发失败中恢复
当并发更新失败,在表示层打印出来不是明智之举。我们应该想办法重新提交事务。一种方式是使用try catch块,不过这种方式将导致业务逻辑代码中含有大量的try catch块。另一种方式是使用Aop interceptor重试事务
注:当应用程序调用了非事务性的api或做了不能恢复的事情(比如发了邮件),事务就不能自动回滚和恢复。在这些情况下,必须在应用程序级别写代码解决。
小结:
如果你使用的是jdbc和ibatis,你必须自己实现乐观锁和悲观锁。相比之下,jdo和hibernate内置的乐观锁和悲观锁会自动产生对应的sql语句。你可以通过一个类的O/R映射来启动乐观锁。关于悲观锁,
jdo需要设置PersistenceManagerFactory属性,hibernate需要在装载对象或执行查询的时候调用一个方法。
分享到:
相关推荐
这是一个关于银行的数据库的处理,模仿的是从账户1转账给...那就需要用到事务,如果没有一起执行,就回滚。这个代码比较简单,希望对大家有帮助,自己建立一个数据库bank,在里面建立一个表Account,两属性:Id,money.
总的来说,数据库事务和并发控制是数据库系统设计和管理的基础,它们确保了数据库在面对多用户、多事务环境时的稳定性和可靠性。理解并掌握这些概念对于开发和维护高效、安全的数据库应用程序至关重要。
正确的调度是指多个事务并发执行时,其结果与某一串行调度的结果相同。可串行化的调度称为正确的调度。 七、并发调度的实例 设 T1、T2、T3 是三个事务:T1: A:=A+2, T2: A:=A*2, T3: A:=A*2。设 A 的初值为 0。...
数据库处理的经典资料: 叫你处理事务 如何并发处理 瞧瞧吧 机不可失哟
8、数据库安全性管理、数据库事务及并发控制.sql
### 数据库事务总结 #### 一、事务的基本概念与特性 **事务**是数据库系统中的一个逻辑工作单元,它由一系列的操作组成,这些操作要么都完成,要么都不完成,以此来保证数据的一致性和完整性。 #### 二、事务的...
掌握数据库恢复的基本技术和策略 1、了解并发操作可能产生的数据不一致性 2、掌握并发控制的技术:封锁机制、三级封锁协议、 活锁的避免、死锁的预防、诊断及解除 3、掌握并发调度的正确性标准和技术(可串行性、 ...
数据库事务处理和并发控制是数据库管理系统(DBMS)中的核心技术, Guarantees 数据库的可靠性和一致性。本文将详细介绍数据库事务处理和并发控制技术的概念、特性和实现机制。 一、事务处理概念 事务处理是数据库...
- **可串行化调度**:虽然事务并发执行,但是其效果等同于串行调度。 #### 五、冲突可串行性 冲突可串行性是一种特殊的可串行化调度,其中只考虑了事务间的冲突操作。如果一个调度中所有的冲突操作都可以重新排列...
数据库的事务处理和并发控制是数据库管理中的核心概念,特别是在SQL Server 2005这样的大型数据库管理系统中。事务是一个逻辑工作单元,它由一系列的数据库操作构成,这些操作作为一个整体执行,要么全部成功,要么...
数据库并发控制是数据库管理系统中的关键组成部分,其目的是确保在多用户环境下,多个事务同时执行时,数据的完整性和一致性不受影响。并发控制的主要任务是防止事务间的不正确交互,如脏读、不可重复读和幻读等现象...
本文提出了一个包含Redis的键值NoSQL数据库的事务模型,以使用户能够以ACID(原子性,一致性,隔离性和持久性)方式访问数据,该模型被生动地称为冲浪并发事务模型。 详细描述了体系结构,重要功能和实现原理。 还...
数据库事务处理是数据库管理系统中的核心概念,用于确保数据的一致性和完整性。事务是数据库操作的基本单元,它包含一组逻辑操作,这些操作要么全部执行,要么全部不执行,以确保数据的原子性。事务处理主要关注两个...
### 数据库事务并发与事务加锁 #### 一、数据库事务基本概念 在数据库领域,事务(Transaction)是由一系列操作组成的逻辑工作单元。事务具备四个关键特性:原子性(Atomicity)、一致性(Consistency)、隔离性...
6. 数据库事务和并发控制:在多用户环境中,数据库需要处理并发操作,以避免数据不一致。事务的概念、ACID(原子性、一致性、隔离性和持久性)属性和并发控制机制,如锁和多版本并发控制(MVCC),都是这一部分的...
数据库思维导图——并发控制 并发控制 多事务执行方式 (1)事务串行执行 每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行 不能充分利用系统资源,发挥数据库共享资源的...事务并发执行带来的问题
第七章 数据库事务和并发控制 数据库事务是保证数据一致性的基本单位,而并发控制则解决了多用户同时访问数据库时可能出现的问题。习题可能考察事务的ACID属性、并发控制技术(如两阶段锁、多版本并发控制MVCC)等。...
在数据库系统中,事务管理、恢复以及并发控制是至关重要的技术,它们确保了数据库的稳定性和数据的一致性。事务是数据库操作的基本单元,具有原子性、一致性、隔离性和持续性(ACID特性)。原子性意味着事务中的所有...