- 浏览: 286784 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
cheetah_ysc:
不错不错,我喜欢!
Java固定时间间隔执行 -
voyage_mh:
阿选百度竟然一下可以吧你百度出来
使用DWR注解Annotation
事务定义:数据库事务是指由一个或多个SQL语句组成的工作单元,这个工作单元中的SQL语句相互依赖,如果有一个SQL语句执行失败,就必须撤销整个工作单元。
事务的特性ACID:原子性,一致性,独立性,持久性
事务可能出现的问题:
-
第一类丢失更新 lost update
-
脏读, 读到还没体检的事务数据 dirty read
-
non-repeatable read 不可重复读
-
second lost update problem 第二次丢失更新
-
phantom read 幻读(插入和删除)
只要考虑2,3,5 其他都是特殊情况
处理这些问题的解决方案,就是事务的隔离机制:
1,read-uncommitted 2,read-committed 4,repeatable read 8,serializable
只要是数据库支持事务,就不会出现上面的第一种情况(lost update)
read-uncommitted会出现2,3,5的问题
read-committed 会出现 3,5 的问题
serializable可解决所有问题,但是效率很低
所以我们在程序中一般设定Hibernate的隔离级别为2(read-committed )
乐观锁和悲观锁的前提也就是hibernate.conection.isolation=2 也就是隔离级别为read-committed
悲观锁是依赖数据库中的锁, 而乐观锁是在程序中做处理, 所以乐观锁的效率要高
下面就先看一个使用悲观锁的简单例子:
package com.lbx.hibernate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Account { private int id; private int balance; //BigDecimal @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public int getBalance() { return balance; } public void setBalance(int balance) { this.balance = balance; } }
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost/testhib</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:SXT</property> <property name="connection.username">scott</property> <property name="connection.password">tiger</property> <property name="dialect">org.hibernate.dialect.OracleDialect</property> --> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> --> <property name="cache.use_second_level_cache">true</property> <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property> <property name="cache.use_query_cache">true</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hbm2ddl.auto">update</property> <!-- Drop and re-create the database schema on startup <property name="hbm2ddl.auto">update</property> --> <mapping class="com.lbx.hibernate.Account"/> </session-factory> </hibernate-configuration>
package com.lbx.hibernate; import org.hibernate.LockMode; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.lbx.hibernate.Account; public class HibernateCacheTest { private static SessionFactory sf; @BeforeClass public static void beforeClass() { sf = new AnnotationConfiguration().configure().buildSessionFactory(); } @AfterClass public static void afterClass() { sf.close(); } @Test public void testSchemaExport() { new SchemaExport(new AnnotationConfiguration().configure()).create(false, true); } @Test public void testSave() { Session session = sf.openSession(); session.beginTransaction(); Account a = new Account(); a.setBalance(100); session.save(a); session.getTransaction().commit(); session.close(); } //没加悲观锁之前,可能会出问题 @Test public void testOperation1() { Session session = sf.openSession(); session.beginTransaction(); Account a = (Account)session.load(Account.class, 1); int balance = a.getBalance(); //没完成之前做点其他的事 balance = balance - 10; a.setBalance(balance); session.getTransaction().commit(); session.close(); } //加了悲观锁之后,就可以解决问题 @Test public void testPessimisticLock() { Session session = sf.openSession(); session.beginTransaction(); Account a = (Account)session.load(Account.class, 1, LockMode.UPGRADE); int balance = a.getBalance(); //do some caculation balance = balance - 10; a.setBalance(balance); session.getTransaction().commit(); session.close(); } public static void main(String[] args) { beforeClass(); } }
下面就是一个乐观锁的简单例子(加了个标记version):
package com.lbx.hibernate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Version; @Entity public class Account { private int id; private int balance; private int version; @Version public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public int getBalance() { return balance; } public void setBalance(int balance) { this.balance = balance; } }
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost/testhib</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:SXT</property> <property name="connection.username">scott</property> <property name="connection.password">tiger</property> <property name="dialect">org.hibernate.dialect.OracleDialect</property> --> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> --> <property name="cache.use_second_level_cache">true</property> <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property> <property name="cache.use_query_cache">true</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hbm2ddl.auto">update</property> <!-- Drop and re-create the database schema on startup <property name="hbm2ddl.auto">update</property> --> <mapping class="com.lbx.hibernate.Account"/> </session-factory> </hibernate-configuration>
package com.lbx.hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.lbx.hibernate.Account; public class HibernateCacheTest { private static SessionFactory sf; @BeforeClass public static void beforeClass() { sf = new AnnotationConfiguration().configure().buildSessionFactory(); } @AfterClass public static void afterClass() { sf.close(); } @Test public void testSchemaExport() { new SchemaExport(new AnnotationConfiguration().configure()).create( false, true); } @Test public void testSave() { Session session = sf.openSession(); session.beginTransaction(); Account a = new Account(); a.setBalance(100); session.save(a); session.getTransaction().commit(); session.close(); } //测试乐观锁 @Test public void testOptimisticLock() { Session session = sf.openSession(); Session session2 = sf.openSession(); session.beginTransaction(); Account a1 = (Account) session.load(Account.class, 1); session2.beginTransaction(); Account a2 = (Account) session2.load(Account.class, 1); a1.setBalance(900); a2.setBalance(1100); session.getTransaction().commit(); //提交之后,改变了 System.out.println(a1.getVersion()); session2.getTransaction().commit(); //所以在这提交再改变数据就报错 System.out.println(a2.getVersion()); session.close(); session2.close(); } public static void main(String[] args) { beforeClass(); } }
发表评论
-
Hibernate查询优化
2010-12-24 14:12 1436查询性能优化 Hibernate可从下面几个方面来优化 ... -
Hibernate检索策略
2010-12-22 19:03 966Hibernate检索策略简介 类级别检索策略:Se ... -
hibernate中ID生成策越
2010-12-19 17:39 601Hibernate中的内置标识符的生成器的用法 ... -
基于Spring容器中的hibernateTemplate的分页
2010-12-03 12:54 3039基于hibernateTemplate的三个分页控制方法 p ... -
基于HibernateDaoSupport的分页
2010-12-03 12:53 2949基于HibernateDaoSupport的三个分页控制方法 ... -
Hibernate 缓存问题
2010-11-16 15:01 1127什么是缓存?? 答:缓存就是在内存中开辟一块空间, ... -
Hibernate 1+N 问题
2010-11-15 21:45 38321+N问题的描述:举例,多个主题(Topic)属于一个帖子( ... -
通过Filter过滤器来实现OSIV模式
2010-11-13 14:44 2699使用Servlet过滤器来实现OSIV模式(Open Sess ... -
Hibernate多对多双向关联(多对多都很少用,双向都少用)
2010-10-26 16:11 983Order类 import java.io.Seria ... -
Hibernate多对多单向关联
2010-10-26 16:05 886Order类定义一个 Set products = new H ... -
Hibernate多对一单向关联
2010-10-26 15:55 1028在多方关联一方 Product(多方)(部分代码) pub ... -
Hibernate一对多单向关联
2010-10-26 15:50 943Category类(一方) import java.util ... -
Hibernate双向映射组件
2010-10-26 15:44 948和单向的类似,只不过多加了一个关联User关联Frofile, ... -
Hibernate组件单向映射
2010-10-26 15:37 462User类中有一个属性 private Profile pro ... -
Hibernate集合映射Set和Map
2010-10-26 15:32 944Set和Map基本和List一样 先看Set 只需要将L ... -
Hibernate集合映射
2010-10-26 15:28 818以User类为例: 在User类中定义一个List集合用于 ... -
Hibernate联合主键
2010-10-26 15:19 1062User类 package com.lbx.mo ... -
Hibernate 原理
2010-10-24 11:37 12071.Hibernate 的初始化. 读取Hibernat ... -
SessionFactory的一个简单的工具类
2010-10-21 12:10 978SessionFactory是一个重量级的类,不可以多new, ... -
使用xml的格式来配置Hibernate
2010-10-21 12:05 942一个简单的User类 相应的xml文件User.hbm ...
相关推荐
Hibernate 对事务并发处理 在 Hibernate 中,对事务并发处理是非常重要的, especialmente 在多用户环境中。事务处理的目的是为了保证数据的可靠性和一致性。 事务四个特性 ACID 1. 原子性(Atomicity):事务...
3. **Hibernate事务配置:**在Spring中,需要配置Hibernate SessionFactory,并将其注入到需要进行数据库操作的服务中。同时,通过`PlatformTransactionManager`接口(如HibernateTransactionManager)配置事务管理...
本文将深入探讨Hibernate中的事务和并发控制,这对于开发高效、稳定的数据库应用至关重要。 首先,我们来理解Hibernate中的事务管理。在数据库操作中,事务是保证数据一致性的重要手段。一个事务包含了一组数据库...
### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...
本教程主要聚焦于Hibernate中的事务并发处理,包括悲观锁和乐观锁两种策略,这对于我们理解如何在高并发环境中确保数据的一致性和完整性至关重要。 首先,事务是数据库操作的基本单元,它确保一组操作要么全部成功...
Hibernate作为一个ORM框架,它对JDBC进行了封装,提供了更高级别的对象和API来处理事务。在Hibernate中,事务可以通过配置为JDBC事务或JTA事务。默认情况下,如果没有明确配置,Hibernate会使用JDBC事务。配置JDBC...
一、Hibernate事务管理 在数据库操作中,事务确保了数据的一致性和完整性。Hibernate提供了四种事务隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化...
Hibernate事务与并发问题处理[收集].pdf
**Hibernate事务管理详解** 在Java开发中,尤其是在企业级应用中,事务管理是不可或缺的一部分。Hibernate作为一款流行的ORM(对象关系映射)框架,提供了强大的事务处理能力。本篇文章将深入探讨Hibernate中的事务...
#### 三、事务并发处理 Hibernate 提供了两种主要的并发控制机制: 1. **乐观锁(Optimistic Locking)**:假设数据不会经常冲突,只有在提交时才会进行冲突检测。Hibernate 通过版本字段实现自动乐观并发控制。 2....
在Java的持久化框架Hibernate中,版本管理机制是实现事务并发控制的重要手段。它通过维护对象的版本信息,确保在多线程环境下数据的一致性和完整性。本文将深入探讨Hibernate中的版本管理机制及其在控制事务并发中的...
【hibernate事务管理机制】是指在使用Hibernate框架进行数据库操作时,如何管理和协调事务的一系列规则和策略。事务管理是确保数据一致性、完整性和并发控制的重要机制。 **悲观锁**是预防性的锁定策略,它假设并发...
这个标题指出我们要讨论的是Hibernate框架在处理查询和数据库并发事务方面的内容。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的方式操作数据库,而无需过多关注底层SQL语言。在第...
### Hibernate事务处理详解 #### 一、事务处理概念与特性 事务处理是数据库操作中一个核心的概念,尤其在处理复杂的业务逻辑时,确保数据的一致性和完整性至关重要。Hibernate作为Java领域中广泛使用的对象关系...
### Hibernate事务管理 #### 非托管环境下的事务处理 在非托管环境中,如独立的Java应用程序或Web应用中,Hibernate通过其内部的连接池机制管理数据库连接。为了执行事务操作,开发者需要遵循以下步骤: 1. **...
在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些场景下会出现特定的异常。 首先,我们需要了解Hibernate中的事务处理。在Java应用中,事务通常与SessionFactory和Session...
**一、Hibernate事务的概念** 事务是一组数据库操作,这些操作被视为一个逻辑单元,要么全部执行,要么全部不执行。这是为了保证数据的一致性。在Hibernate中,事务管理通常通过SessionFactory和Session接口来实现。...
总的来说,理解和掌握Hibernate的事务处理和并发控制是开发高效、可靠的应用程序的关键。开发者应熟悉JDBC、SQL和数据库事务隔离级别,以及如何通过合理配置和编程实践来优化并发性能,以适应不同的应用场景。