事务四大特性:
原子性、一致性、持续性、隔离性
- 原子性,事务操作具有原子性,要么全部完成,要么全部回退;
- 一致性,事务操作对象状态是一致,不受事务操作影响;
- 持续性,事务操作结果在没有外力影响下,其是持久不变的;
- 隔离性,多个事务之间操作是不相干扰的;
事务隔离级别:
一个事务对数据库的修改与并行的另一个事务的隔离程度;
两个并发事务同时访问数据库表相同行时,可能存在以下三个问题:
- 幻想读,事务T1读取一条指定where条件的语句,返回结果集;此时事务T2插入一行新记录,恰好满足T1的where条件。
然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。- 不可重复读取,事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同;
- 脏读,事务T1更新了一行记录,还未提交所做的修改,这个事务T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据;
事务隔离级别主要就是针对上述的三种情况来进行区分:
- READ UNCOMMITTED 幻想读、不可重复读和脏读都允许;
- READ COMMITTED 允许幻想读、不可重复读,不允许脏读;
- REPEATABLE READ 允许幻想读,不允许不可重复读和脏读;
- SERIALIZABLE 幻想读、不可重复读和脏读都不允许;
oralce 数据库允许READ COMMITTED 与 SERIALIZABLE
事务控制:
分为两种:数据库事务控制、业务逻辑事务控制:
- 数据库事务控制:
对于jdbc而言,每次数据库操作都是统一手动提交,当其操作发生异常时统一回退操作,保证数据库数据变化一致;
对于持久层框架而言,如mybatis、hibernate而言,在项目中都交由spring容器控制(其主要控制是通过spring AOP来实现);- 业务逻辑事务控制:
分为两种:在前端添加校验条件及时响应并发出提示;在后端校验不通过的情况下直接抛出异常信息并停止操作;