Spring事务控制

1、关键点

1、Spring数据访问基于JDBC的API

注册驱动
获取连接
创建语句集
获取结果集

2、注册驱动,采用的抽象工厂的方式

3、事务管理器

事务管理器管理的为DataSource数据源
DataSource对Connection使用包装器模式,DataSource是对Connection的包装。
事务管理器从DataSource中获取Con,将Con的提交方式设置AutoCommit为false,通过Con控制事务提交或回滚。
ConnectionImpl最终操作的是Socket

4、SQL在数据库引擎的操作

增、删、改 操作的是对应表的临时表(在内存),如果有主键冲突、外键冲突等其他异常,会导致结果直接从临时表返回,不进行插入。
Commit操作的是将临时表的数据真正插入数据表。

5、数据库的隔离级别

read-uncommited 脏读、不可重复读、幻读
read-commited 避免脏读,会导致不可重复读、幻读
repeatable read 避免脏读、不可重复读,会导致幻读 ,使用 MMVC机制 实现可重复读

可重复读可以通过手动加锁,避免幻读。

RR级别下只要对 SELECT 操作也手动加行(X)锁即可类似 SERIALIZABLE 级别(它会对 SELECT 隐式加锁),即大家熟知的:
这里需要用 X锁, 用 LOCK IN SHARE MODE 拿到 S锁 后我们没办法做 写操作
SELECT id FROM users WHERE id = 1 FOR UPDATE;
如果 id = 1 的记录存在则会被加行(X)锁,如果不存在,则会加 next-lock key / gap 锁(范围行锁),即记录存在与否,mysql 都会对记录应该对应的索引加锁,其他事务是无法再获得做操作的。
这里我们就展示下 id = 1 的记录不存在的场景,FOR UPDATE 也会对此 “记录” 加锁,要明白,InnoDB 的行锁(gap锁是范围行锁,一样的)锁定的是记录所对应的索引,且聚簇索引同记录是直接关系在一起的。

serializable 避免脏读、不可重复度、幻读

脏读:读到了未提交的数据,称之为脏读

不可重复读:在两次事务中,读到的数据不一致,称之为不可重复读

幻读:在两次事务中,首次事务对一定范围内的数据进行更改,另一事务在同一范围内插入了数据,导致首次事务查询的状态不在可以维护接下来的业务操作。

一次select是读取,第二次的 insert 其实也属于隐式的读取,只不过是在 mysql 的机制中读取的,插入数据也是要先读取一下有没有主键冲突才能决定是否执行插入。
不可重复读侧重表达 读-读,幻读则是说 读-写,用写来证实读的是鬼影。

6、事务的传播属性

required
new
not supported
never

2、分布式事务

分布式事务特性:CAP
Consistence 一致性
Avaliable 可用性
Partition Tolerance 分区容错性

事务通过日志异步实现

posted @ 2020-05-20 22:00  南宫煌_慧  阅读(162)  评论(0编辑  收藏  举报