hibernate的事务
@sunRainAmazing
事务
Spring的事务和Hibernate的事务有什么区别?
hibernate的事务通过显示的添加代码完成,
Spring是通过动态代理切入运行时添加代码管理完成的,
所谓AOP,
如果Spring配置的是Hibernate事务管理,
动态切入的代码应该是和手写hibernate事务管理基本一致的
所以,无论用何种事务方式,
只要保证事务里面的调用的所有方法没有被其他的事务管理就可以实现事务
数据库事务的概念
数据库事务是指由一个或多个SQL语句组成的工作单元,
这个工作单元中的SQL语句相互依赖,
如果有一个SQL语句执行失败,就必须撤销整个工作单元。
在并发环境中,多个事务同时访问相同的数据资源时,
可能会造成各种并发问题,可通过设定数据库的事务隔离级别来避免,
还可采用悲观锁和乐观锁来解决丢失更新这一并发问题。
数据库事务必须具备ACID特征:
A: Atomic原子性,
整个事务不可分割,要么都成功,要么都撤销。
C: Consistency一致性,
事务不能破坏关系数据的完整性和业务逻辑的一致性,
例如转账,应保证事务结束后两个账户的存款总额不变。
I: Isolation隔离性,
多个事务同时操纵相同数据时,每个事务都有各自的完整数据空间
D: Durability持久性,
只要事务成功结束,对数据库的更新就必须永久保存下来,即使系
hibernate控制事务的方法:
1. 调用sessionFactory不带参数的openSession方法,
// 从连接池获得连接,Session自动把连接设为手工提交事务模式。
Session session = sessionFactory.openSession();
// 若调用带connection参数的openSession,则需要自己设置手工提交:
connection.setAutoCommit(false);
Session session = sessionFactory.openSession(connection);
2. 声明事务的开始边界
Transaction tx = session.beginTransaction();
3. 提交事务
tx.commit();
4. 撤销事务:
tx.rollback();
一个session可以对应多个事务,
但是应优先考虑让一个session只对应一个事务,
当一个事务结束或撤销后,就关闭session.
不管事务成功与否,最后都应调用session的close关闭session。
任何时候一个session只允许有一个未提交的事务,不能同时开始两个事务
事务隔离级别:
为了解决多个事务并发会引发的问题。
数据库系统提供了四种事务隔离级别供用户选择。
Serializable:串行化。隔离级别最高
Repeatable Read:可重复读。
Read Committed:读已提交数据。
Read Uncommitted:读未提交数据。隔离级别最差。