一 事务的概念
逻辑上的一组操作,含有几个组成部分,这几个部分构成一个整体,操作要么全部成功,要么全部失败并返回原状态!
典型举例:银行转账: 扣款 和 入账 必须同时执行成功,要么都不成功,要么都成功
二事务的特性
1.原子性:即一个事务就是一个最小单位,不可再进行分割
2.一致性:即一个事务内操作要么全部成功,要么全部都不成功,保持原样,执行前后状态一直
3.隔离性:事务执行过程中 不应该受到其他事务干扰
4.持久性:事务一旦提交,就会被保存到数据库中
三 隔离性不佳会引发的问题
1 脏读 : 读取到另外一个事务尚未提交的数据(另外也给事务可能操作了但没有持久化)
2 不可重复读: 一个事务读取到另外一个事务已经提交的update数据,造成多次查询数据不一致(查询到可能未提交过会提交,两次数据不一致)
3 虚读(幻读):一个事务读取到另外一个事务已经提交的insert数据,造成查询前后数据不一致
四 隔离级别(读取采用隔离级别解决)
1. read uncommitted | 0 未提交读
此隔离级别最低,可能发生多种状况 ,即效率高、不安全
2.read committed | 1 已提交读 oracle默认隔离级别
此隔离级别只能看到已经提交的数据,但有可能有不可重复读问题。 避免脏读
3.repeatable read | 2 可重复读 mysql默认隔离级别
可以确保同一个事务中多个实例并发读取数据时,看到到的数据一致。但可能有幻读问题。避免脏读和不可重复读
4.serializable | 3 可序列化
可以确保以上几种情况都不会发生,强制所有事务排序,但效率低,一般不会使用。
五 hibernate数据丢失问题(更新操作采用verion控制解决)
举例: 同一条数据对象同时被两个事务同时读取到更新,造成一组事务更新数据丢失,只有最后一个事务更新成功。
解决方案:
1.悲观锁:
将表单锁住,等待一个更新完毕,另外一个才可以操作
2.乐观锁:
在JavaBean上加上version属性,两组事务同时读取到version0; 其中一个事务更新后javabean版本号会变更为version1,另外一组事务更新是发现版本号变了,则重新读取再更新. 需要在xml中配置<version name="version"></version>属性