一、事务的编写规范
1、事务的基本概念:
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性
单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使
应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的一个逻辑工作单
位,由DBMS中的事务管理子系统负责事务的处理。
2、特性:
原子性、一致性、隔离性和持久性。
3、不考虑隔离性会出现的问题。
(1)脏读
(2)不可重复读
(3)虚读
4、设置事务的隔离性
(1)Read Uncommitted :1级。允许你读取还未提交的已经改变的数据。可能导致脏读、虚读、不可重复读问题。
(2)Read Committed:2级。允许在并发事务已经提交后读取。可以防止脏读,但虚读和不可重复读仍有可能发生。
(3)Repeatable Read:4级。对相同字段的多次读取是一致的,除非数据被事务本身改变。但虚读还是有可能出现。
(4)serializable :8级。完全服从AIDC的隔离原则,确保不发生脏读、虚读和不可重复读。
5、事务的规范代码结构
try {
//开启事物 //操作数据 //提交事物
} catch (Exception e) {
// 事务回滚
}finally{
//释放资源
}
6、规范代码示例
@Test
public void test8(){ SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
//开启事物
sessionFactory = HibernateUtils.getFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
//操作数据
UserEntity user1 = session.get(UserEntity.class, 2);
System.out.println(user1);
//提交事物
tx.commit();
} catch (Exception e) {
// 事务回滚
tx.rollback();
}finally{
//释放资源
session.close();
sessionFactory.close();
}
}
二、Hibernate绑定session
1、session类似于JDBC中的Connection连接。
2、绑定session,底层是使用threadLoacl.
3、绑定原因:session是单线程的,一个session只能被一个线程使用,绑定后可以防止一个session被多个线程使用,出现异常。
4、绑定步骤:
(1)在核心配置文件中进行配置(必须要配置)
<!-- 在hibernate核心配置文件中配置 -->
<property name="hibernate.current_session_context_class">thread</property>
(2)编写代码:
@Test
public void test9(){
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getFactory();
session = sessionFactory.getCurrentSession();
tx = session.beginTransaction();
UserEntity user1 = session.get(UserEntity.class, 2);
System.out.println(user1);
tx.commit();
} catch (Exception e) {
tx.rollback();
}finally{
sessionFactory.close();
}
}
5、使用该绑定线程在结束后不需要手动关闭该session,该session会随着线程的结束而自动关闭。
验证自动关闭
代码:
@Test
public void test10(){
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getFactory();
session = sessionFactory.getCurrentSession();
tx = session.beginTransaction();
UserEntity user1 = session.get(UserEntity.class, 2);
System.out.println(user1);
tx.commit();
} catch (Exception e) {
tx.rollback();
}finally{
session.close();
sessionFactory.close();
}
}
结果:测试出现异常,提示该session已经被关闭。