Hibernate —— Hibernate 的事务管理
2017-07-19 14:24
281 查看
一、事务隔离与隔离级别的关系
JDBC 事务详解:http://blog.csdn.net/qq_19865749/article/details/75369529
在一个实际应用中,开发者经常不能确定使用什么样的隔离级别。太严厉的级别将降低并发事务的性能,但是不足够的隔离级别又会产生一些小的Bug,而这些Bug只会在系统重负荷(也就是并发严重时)的情况下才会出现。
读操作未提交:
一般来说,读操作未提交(Read Uncommitted)是很危险的。一个事务的回滚或失败都会影响到另一个并行的事务,或者说在内存中留下和数据库中不一致的数据。这些数据可能会被另一个事务读取并提交到数据库中。这是完全不允许的。
可串行化:
大部分程序并不需要可串行化隔离(Serializable Isolation)。虽然,它不允许幻读,但一般来说,幻读并不是一个大问题。可串行化隔离需要很大的系统开支,很少有人在实际开发中使用这种事务隔离模式。
读操作已提交、可重读:
读操作已提交(Read Committed)和可重读(Repeatable Read)是用的较多的隔离级别。Hibernate可以很好地支持可重读(Repeatable Read)隔离级别。
二、在Hibernate配置文件中设置隔离级别
JDBC连接数据库使用的是默认隔离级别,即读操作已提交(Read Committed)和可重读(Repeatable Read)。在hibernate的配置文件hibernate.properties中,可以修改隔离级别:
在上一行代码中,Hibernate事务的隔离级别是4,这是什么意思呢?级别的数字意义如下。
1:读操作未提交(Read Uncommitted)
2:读操作已提交(Read Committed)
4:可重读(Repeatable Read)
8:可串行化(Serializable)
因此,数字4表示“可重读”隔离级别。如果要使以上语句有效,应把此语句行前的注释符“#”去掉:
hibernate.connection.isolation 4
也可以在配置文件hibernate.cfg.xml中加入以下代码:
在开始一个事务之前,Hibernate从配置文件中获得隔离级别的值。
三、在Hibernate中使用JDBC事务
Hibernate对JDBC进行了轻量级的封装,它本身在设计时并不具备事务处理功能。Hibernate将底层的JDBCTransaction或JTATransaction进行了封装,再在外面套上Transaction和Session的外壳,其实是通过委托底层的JDBC或JTA来实现事务的处理功能的。
要在Hibernate中使用事务,可以在它的配置文件中指定使用JDBCTransaction或者JTATransaction。在hibernate.properties中,查找“transaction.factory_class”关键字,得到以下配置:
# hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory # hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
在JDBC的提交模式(commit mode)中,如果数据库连接是自动提交模式(auto commit mode),那么在每一条SQL语句执行后事务都将被提交,提交后如果还有任务,那么一个新的事务又开始了。
Hibernate的事务工厂类可以设置成JDBCTransactionFactory或者JTATransactionFactory。如果不进行配置,Hibernate就会默认为系统使用的事务是JDBC事务。
Hibernate在Session控制下,在取得数据库连接后,就立刻取消自动提交模式,即Hibernate在一个执行Session的beginTransaction()方法后,就自动调用JDBC层的setAutoCommit(false)。
Hibernate 事务处理例子:
try {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction(); //在默认情况下,开启一个JDBC事物
for(int i=0; i<10; i++) {
Student stu = new Student();
stu.setName("Student" + i);
session.save(stu);
}
tx.commit(); //提交事务
session.close();
} catch(Exception e) {…
tx.rollback(); //事务回滚
}
四、 在Hibernate中使用JTA事务
JTA(Java Transaction API)是事务服务的J2EE解决方案。本质上,它是描述事务接口的J2EE模型的一部分,开发人员直接使用该接口或者通过J2EE容器使用该接口来确保业务逻辑能够可靠地运行。
JTA有3个接口,它们分别是UserTransaction接口、TransactionManager接口和Transaction接口。这些接口共享公共的事物操作,例如commit()和rollback(),但也包含特殊的事务操作,例如suspend()、resume()和enlist(),它们只出现在特定的接口上,以便在实现中允许一定程度的访问控制。
在一个具有多个数据库的系统中,可能一个程序会调用几个数据库中的数据,需要一种分布式事务,或者准备用JTA来管理跨Session的长事务,那么就需要使用JTA事务。下面介绍如何在Hibernate的配置文件中配置JTA事务。在hibernate.properties文件中设置如下(把JTATransactionFactory所在的配置行的注释符“#”取消掉):
JDBC 事务详解:http://blog.csdn.net/qq_19865749/article/details/75369529
隔 离 级 别 | 脏读(Dirty Read) | 不可重读(Unrepeatable read) | 幻读(Phantom Read) |
读操作未提交(Read Uncommitted) | 可能 | 可能 | 可能 |
读操作已提交(Read Committed) | 不可能 | 可能 | 可能 |
可重读(Repeatable Read) | 不可能 | 不可能 | 可能 |
可串行化(Serializable) | 不可能 | 不可能 | 不可能 |
读操作未提交:
一般来说,读操作未提交(Read Uncommitted)是很危险的。一个事务的回滚或失败都会影响到另一个并行的事务,或者说在内存中留下和数据库中不一致的数据。这些数据可能会被另一个事务读取并提交到数据库中。这是完全不允许的。
可串行化:
大部分程序并不需要可串行化隔离(Serializable Isolation)。虽然,它不允许幻读,但一般来说,幻读并不是一个大问题。可串行化隔离需要很大的系统开支,很少有人在实际开发中使用这种事务隔离模式。
读操作已提交、可重读:
读操作已提交(Read Committed)和可重读(Repeatable Read)是用的较多的隔离级别。Hibernate可以很好地支持可重读(Repeatable Read)隔离级别。
二、在Hibernate配置文件中设置隔离级别
JDBC连接数据库使用的是默认隔离级别,即读操作已提交(Read Committed)和可重读(Repeatable Read)。在hibernate的配置文件hibernate.properties中,可以修改隔离级别:
#hibernate.connection.isolation 4
在上一行代码中,Hibernate事务的隔离级别是4,这是什么意思呢?级别的数字意义如下。
1:读操作未提交(Read Uncommitted)
2:读操作已提交(Read Committed)
4:可重读(Repeatable Read)
8:可串行化(Serializable)
因此,数字4表示“可重读”隔离级别。如果要使以上语句有效,应把此语句行前的注释符“#”去掉:
hibernate.connection.isolation 4
也可以在配置文件hibernate.cfg.xml中加入以下代码:
<session-factory> ….. //把隔离级别设置为4 <property name=” hibernate.connection.isolation”>4</property> …… </session-factory>
在开始一个事务之前,Hibernate从配置文件中获得隔离级别的值。
三、在Hibernate中使用JDBC事务
Hibernate对JDBC进行了轻量级的封装,它本身在设计时并不具备事务处理功能。Hibernate将底层的JDBCTransaction或JTATransaction进行了封装,再在外面套上Transaction和Session的外壳,其实是通过委托底层的JDBC或JTA来实现事务的处理功能的。
要在Hibernate中使用事务,可以在它的配置文件中指定使用JDBCTransaction或者JTATransaction。在hibernate.properties中,查找“transaction.factory_class”关键字,得到以下配置:
# hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory # hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
在JDBC的提交模式(commit mode)中,如果数据库连接是自动提交模式(auto commit mode),那么在每一条SQL语句执行后事务都将被提交,提交后如果还有任务,那么一个新的事务又开始了。
Hibernate的事务工厂类可以设置成JDBCTransactionFactory或者JTATransactionFactory。如果不进行配置,Hibernate就会默认为系统使用的事务是JDBC事务。
Hibernate在Session控制下,在取得数据库连接后,就立刻取消自动提交模式,即Hibernate在一个执行Session的beginTransaction()方法后,就自动调用JDBC层的setAutoCommit(false)。
Hibernate 事务处理例子:
try {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction(); //在默认情况下,开启一个JDBC事物
for(int i=0; i<10; i++) {
Student stu = new Student();
stu.setName("Student" + i);
session.save(stu);
}
tx.commit(); //提交事务
session.close();
} catch(Exception e) {…
tx.rollback(); //事务回滚
}
四、 在Hibernate中使用JTA事务
JTA(Java Transaction API)是事务服务的J2EE解决方案。本质上,它是描述事务接口的J2EE模型的一部分,开发人员直接使用该接口或者通过J2EE容器使用该接口来确保业务逻辑能够可靠地运行。
JTA有3个接口,它们分别是UserTransaction接口、TransactionManager接口和Transaction接口。这些接口共享公共的事物操作,例如commit()和rollback(),但也包含特殊的事务操作,例如suspend()、resume()和enlist(),它们只出现在特定的接口上,以便在实现中允许一定程度的访问控制。
在一个具有多个数据库的系统中,可能一个程序会调用几个数据库中的数据,需要一种分布式事务,或者准备用JTA来管理跨Session的长事务,那么就需要使用JTA事务。下面介绍如何在Hibernate的配置文件中配置JTA事务。在hibernate.properties文件中设置如下(把JTATransactionFactory所在的配置行的注释符“#”取消掉):
hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory # hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory或者在hibernate.cfg.xml文件中配置如下:
<session-factory> ….. <property name=” hibernate.transaction.factory_class”> org.hibernate.transaction.JTATransactionFactory </property> …… </session-factory>JTA 事务例子:
javax.transaction.UserTransaction tx = null; tx = new initialContext().lookup(” javax.transaction.UserTransaction ”) ; tx.begin(); Session s1 = sf.openSession(); …… s1.flush(); s1.close(); Session s2 = sf.openSession(); …… s2.flush(); s2.close(); tx.commit();
相关文章推荐
- Spring声明式事务管理、Spring整合Hibernate
- Spring管理Hibernate事务
- Spring整合Hibernate管理事务(xml配置方式)
- hibernate-事务管理
- Spring管理 hibernate 事务配置的五种方式
- Spring中事务管理与Hibernate自带事务管理冲突的一个问题
- spring mvc+hibernate 实现事务管理(配置文件版)
- spring mvc+hibernate 实现事务管理(全注解版)
- hibernate-事务管理
- 阿录帮帮忙—Hibernate与JdbcTemplate共享事务管理
- sping 对 hibernate进行事务管理--Annotation, xml, 大多数使用XML
- 解决一个Sping管理hibernate时的事务问题(No Hibernate Session bound to thread)
- hibernate中的事务管理是怎么概念?
- Spring整合hibernate的事务属性介绍以及声明式事务管理 (使用Annotation和xml)
- Spring3整合Hibernate3.6之二:用AOP管理事务处理
- spring 管理事务配置时,结果 报错: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here这个异常
- Spring 3.2.2 与Hibernate 4.3.5 集成(事务交给Spring管理)
- 学习笔记:spring与hibernate整合(采用aop来管理事务来实现声明式事务)
- hibernate-事务管理