事务的理解transaction

一 事务的概念

逻辑上的一组操作,含有几个组成部分,这几个部分构成一个整体,操作要么全部成功,要么全部失败并返回原状态!

典型举例:银行转账: 扣款 和 入账 必须同时执行成功,要么都不成功,要么都成功


二事务的特性

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>属性

猜你喜欢

转载自blog.csdn.net/java_raylu/article/details/73727496