Hibernate事务操作
--事务相关概念
1.什么是事务
事务是操作中最基本的单元,事务表示一组操作,要么都成功 ,有一个失败,其他的都失败
2.事务特性
事务具备原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)4个属性,简称ACID。下面对这4个特性分别进行说明。
(1)原子性:将事务中所做的操作捆绑成一个原子单元,即对于事务所进行的数据修改等操作,要么全部执行,要么全部不执行。
(2)一致性:事务在完成时,必须使所有的数据都保持一致状态,而且在相关数据中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构都应该是正确的。
(3)隔离性:由并发事务所做的修改必须与任何其他事务所做的修改相隔离。事务查看数据时数据所处的状态,要么是被另一并发事务修改之前的状态,要么是被另一并发事务修改之后的状态,即事务不会查看由另一个并发事务正在修改的数据。这种隔离方式也叫可串行性。
(4)持久性:事务完成之后,它对系统的影响是永久的,即使出现系统故障也是如此。
3.不考虑隔离性产生问题
(1)脏读
t1开始事务
t2开始事务
t3查询存款余额为1000元
t4
t5取出100元,把存款余额改为900元
t6查询账户余额为900元(脏读)
t7撤销事务,账户的存款余额恢复为1000元
t8汇入100元,存款余额改为1000元
t9提交事务
t2开始事务
t3查询存款余额为1000元
t4
t5取出100元,把存款余额改为900元
t6查询账户余额为900元(脏读)
t7撤销事务,账户的存款余额恢复为1000元
t8汇入100元,存款余额改为1000元
t9提交事务
(2)不可重复读
t1开始事务
t2开始事务
t3查询账户余额为1000元
t4查询账户余额为1000元
t5取出100元,余额改为900元
t6提交事务
t7查询账户余额为900元
t8到底余额是1100元还是900+100元?
t2开始事务
t3查询账户余额为1000元
t4查询账户余额为1000元
t5取出100元,余额改为900元
t6提交事务
t7查询账户余额为900元
t8到底余额是1100元还是900+100元?
(3)虚读
t1开始事务
t2开始事务
t3统计网站注册人数为1000人
t4注册一个新用户
t5提交事务
t6统计网站注册人数为1000人(虚读)
t7到底哪个统计数据有效?
t2开始事务
t3统计网站注册人数为1000人
t4注册一个新用户
t5提交事务
t6统计网站注册人数为1000人(虚读)
t7到底哪个统计数据有效?
4.设置事务隔离级别
锁机制能解决各种并发问题,但是会影响并发性能,为了能让用户根据实际应用的需要,在事务的隔离性和并发性之间做出合理权衡,数据库系统提供了四种事务隔离级别供用户选择:
8 Serializable:串行化 完全看不到其他事务的更新,串行等待
4 Repeatable Read:可重复读 事务可看到其他事务已提交的新插入记录,但是不能 看到其他事务对已有记录的更新
2 Read Commited:读已提交数据 事务可看到其他事务已提交的新插入记录,还能看 到其他事务已经提交的对已有记录的更新
1 Read Uncommited: 读未提交数据 事务可看到其他事务没有提交的新插入记录, 还能看到其他事务没有提交的对已有记录的更新
优先考虑隔离级别为Read Commited,能避免脏读,有较好的并发性能,可能会导致 不可重复读、虚读和第二类丢失更新,但是可以采用悲观锁或乐观锁来控制。
8 Serializable:串行化 完全看不到其他事务的更新,串行等待
4 Repeatable Read:可重复读 事务可看到其他事务已提交的新插入记录,但是不能 看到其他事务对已有记录的更新
2 Read Commited:读已提交数据 事务可看到其他事务已提交的新插入记录,还能看 到其他事务已经提交的对已有记录的更新
1 Read Uncommited: 读未提交数据 事务可看到其他事务没有提交的新插入记录, 还能看到其他事务没有提交的对已有记录的更新
优先考虑隔离级别为Read Commited,能避免脏读,有较好的并发性能,可能会导致 不可重复读、虚读和第二类丢失更新,但是可以采用悲观锁或乐观锁来控制。
mysql默认级别repeatable read
--Hibernate事务代码规范写法
1.代码结构
try{
开启事务
提交事务
}catch{
回滚事务
}finally{
关闭
}