2、认识事务
2.1、为什么需要事务
如何解决呢 使用事务
2.2、什么是事务
事务的概念:
数据库事务是访问并可能更新数据库中各种数据项的一个程序执行单元
事务的组成:
一个数据库事务通常包含对数据库进行读或写的的一个操作序列
事务的相关特性:
-
数据库事务可以包含一个或多个数据库操作,但这些操作构成一个逻辑上的
整体。 -
构成逻辑整体的这些数据库操作,要么全部执行成功,要么全部执行不成功。
-
构成事务的所有操作,要么全都对数据库产生影响,要么全都不产生影响,
即不管事务是否执行成功,数据库总能保持一致性状态。
-
以上即使在数据库出现故障以及并发
事务存在的情况下依然成立。
2.3、解决方法
2.4、事务特性
3、事务异常
3.1、脏读
读未提交
3.2、不可重复读
读已提交
3.3、幻读
统计性事务就是查询 多条数据 汇总出一个结果,不可能重复读只有一条
4、事务隔离级别
4.1、什么叫隔离级别:
事务并发操作同一批数据的时候所导致的问题可以通过设置隔离级别来解决。
4.2、隔离级别的分类(从低到高):
➢读未提交(READ UNCOMMITTED)
➢读已提交(READ COMMITTED)–Oracle默认级别
➢可重复读(REPEATABLE READ)–MySQL默认级别
➢串行化(SERIALIZABLE)
隔离级别从小到大安全性越来越高,但是效率越来越低
5、事务并发异常-丢失更新
5.1、丢失更新 概念
如果多个线程操作,基于同一个查询结构对表中的记录进行修改,
那么后修改的记录将会覆盖前面修改的记录,前面的修改就丢失掉了
,这就叫做更新丢失。
5.2、第一类丢失更新: 回滚丢失
所有隔离级别都不允许第一 类丢失更新发生,不考虑之中
5.3、第二类丢失更新 :覆盖丢失
所有隔离级别都不允许第一 类丢失更新发生
5.4、如何解决第二类 丢失更新
5.4.1、悲观锁机制
假定这样的问题是高概率的,最好一开始就锁住,免得更新老是出错。
➢添加共享锁方式: select * from account lock in share mode ;
➢添加排它锁方式: select * from account for update;
5.4.2、乐观锁机制
假定这样的问题是小概率的,最后一步做更新的时候再锁住,免得锁住时间太长影响其他人做有关操作。
➢在表中增加一-个类型是timestamp字段,并将其设置只要该表进行插入或修改操作时都会更新该字段
为最新时间;
➢在修改数据时通过检查timestamp是否改变判断出当前更新基于的查询是否已经是过时的版本;
5.4.3、乐观锁机制演示
5.4.4、乐观锁与悲观锁如何选择
在用户并发数比较少且冲突比较严重的应用系统中选择悲观锁b方法,
其他情况首先乐观锁版本列法
这里是引用