1.什么是事务
事务:事务指的是逻辑上的一组操作,组成这组操作上的各个逻辑单元要么全部成功,要么全部失败。
事务特性
- 原子性(Atomicity )
代表事务不可分割。 - 持久性(Durability)
代表事务执行完成后,数据就持久到数据库中。 - 一致性(Consistency)
代表事务执行的前后,数据的完整性保持一致。
比如:
转账问题,假设刘备一共有10000¥,张飞和关羽没钱,
现在刘备转给关羽3000¥,转给张飞3000¥,则刘备剩余4000¥,
总之,无论怎么他们怎么相互转账,总额10000¥是不会变的。 - 隔离性(Isolation)
代表一个事务执行过程中,不应该受到其他事务的干扰。
如果不考虑隔离性,会引发安全性问题
-
读问题
-
脏读:一个事务读到另一个事务还没提交的事务。
例如:
张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。
与此同时,事务B正在读取张三的工资,读取到张三的工资为8000。
随后,事务A发生异常,而回滚了事务。张三的工资又回滚为5000。
最后,事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。 -
不可重复读:一个事务读到另一个事务已经提交的update数据,导致在前一个事务多次查询结果不一致。
例如:
在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。
与此同时,事务B把张三的工资改为8000,并提交了事务。
随后,在事务A中,再次读取张三的工资,此时工资变为8000。
在一个事务中前后两次读取的结果并不致,导致了不可重复读。 -
虚读:一个事务已经读到另一个事务已经提交的insert数据,导致其前一个事务多次查询结果不一致。
例如:
目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。
此时,
事务B插入一条工资也为5000的记录。
这是,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。
-
-
写问题
引发两类丢失更新 -
读问题的解决
事务隔离级别- Read uncommitted (读未提交):以上问题都会发生。
- Read committed (读已提交):可避免脏读的发生。(Oracle)
- Repeatable read (可重复读): 可避免脏读、不可重复读,但虚读有可能发生。(MySQL)
- Serializable (可序列化):可避免脏读、不可重复读、幻读的发生。安全性高,但效率低。
ervice层事务
hibernate解决service的事务管理
改写工具类
public class HibernateUtils {
public static final Configuration cfg;
public static final SessionFactory sf;
static {
cfg = new Configuration().configure();
sf=cfg.buildSessionFactory();
}
public static Session openSession() {
return sf.openSession();
}
public static Session getCurrentSession() {//当前线程绑定的session
return sf.getCurrentSession();
}
}
配置完成
<!-- 设置当前线程绑定的Session -->
<property name="hibernate.current_session_context_class">thread</property>