【Hibernate】5.hibernate事务
程序员文章站
2022-05-09 15:59:03
...
1.数据库事务
事务是指一组相互依赖的操作行为,如银行交易,股票交易等。事务的成功在于互相依赖的操作都执行成功,只要其中一个失败,则整个事务失败,需要回滚。
2.数据库事务的生命周期
3.数据库事务的四大特性 ACID
原子性(原子)
一致性(一致性)
隔离性(隔离)
持久性(持续时间)
4.声明事务边界
事务的开始边界:
事务的结束边界:提交事务,提交,保存被事务更新的数据库状态;
事务的异常边界:撤销事务,rolback,使事务退回到执行前的状态;
5.多个事务并发运行的并发问题
第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖;
脏读:一个事务读到另一个事务未提交的更新数据;
虚读:一个事务读到另一个事务已提交的新插入的数据;
不可重复读:一个事务读到另一个事务已提交的更新数据;
第二类丢失更新:是不可重复读的特例,一个事务覆盖另一个事务已提交的更新数据。
例如:
并发运行的两个事务易导致脏读
时间 | 取款事务 | 支票转账事务 |
T1 | 开始事务 | |
T2 | 开始事务 | |
T3 | 查询账户的存款余额为1000元 | |
T4 | ||
T5 | 取出100元,修改余额为900元 | |
T6 | 查询账户余额为900元(脏读) | |
T7 | 撤销该事务,把余额修改为1000元 | |
T8 | 汇入100元,账户余额修改为1000元 | |
T9 | 提交事务 |
并发运行的两个事务易导致第二类丢失更新
时间 | 取款事务 | 支票转账事务 |
T1 | 开始事务 | |
T2 | 开始事务 | |
T3 | 查询账户的存款余额为1000元 | |
T4 | 查询账户的存款余额为1000元 | |
T5 | 取出100元,修改余额为900元 | |
T6 | 提交事务 | |
T7 | 汇入100元,账户余额修改为1100元 | |
T8 | 提交事务 |
6.事务的隔离级别
隔离级别 | 是否出现第一类丢失更新 |
出现是否脏读 |
出现是否虚读 |
出现是否不可重复读 |
出现是否第二类丢失更新 |
序列化 | 否 | 否 | 否 | 否 | 否 |
可重复的阅读 | 否 | 否 | 是 | 否 | 否 |
阅读委托 | 否 | 否 | 是 | 是 | 是 |
阅读未定 | 否 | 是 | 是 | 是 | 是 |
设定隔离级别:
隔离级别越高,越能保证数据的完整性与一致性,但是对并发性能的影响也越大。
对于多数应用程序,可优先考虑将其数据库系统的隔离级别设为Read Commited,它能够避免脏读,并具有较好的并发性能,尽管会导致
用SEESION来执行事务的流程
会话会话= factory.openSession();
交易tx;
尝试{
//开始一个事务
tx = session.beginTransaction();
//执行事务
...
//提交事务
tx.commit();
catch(Exception e){
//若出现异常,就撤销事务
if(tx!= null)tx.rollback();
扔e;
}最后{
//不管事务执行成功与否,最后都关闭会话
session.close();
}
上一篇: 事务模型