JDBC事务相关知识点

一、事务

事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。
1、事务的特性(ACID特性)
A:原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
B:一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
C:隔离性(Isolation)
一个事务的执行不能被其他事务干扰。
D:持续性/永久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

2、事务并发
A:脏读
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
B:不可重复读
是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的现象,因此称为是不可重复读。
C:幻读
是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

3、事务的隔离级别
A:读未提交
其他线程能够读到当前线程已经修改但是没有提交的数据。
可能出现任何事务并发问题,性能最好。
在这里插入图片描述
上图中,对于会话B而言一切正常,而对于会话A来说就很莫名其妙了。产生这种现象的原因就是会话A读取到了会话B中的尚未提交表操作结果。读未提交的性能最好,但是会产生所有的事务并发问题,包括脏读、不可重复读以及幻读。
B:读已提交
其他线程能不够读到当前线程已经修改但是没有提交的数据,只能读到当前线程已经提交的数据信息。防止脏读,没有处理不可重复读,也没有处理幻读;性能比REPEATABLE READ 好。
在这里插入图片描述
会话B:一切正常。
会话A:因为只能读取到其他会话已经提交事务的数据,所以在会话B提交事务前后对统一表格读取到结果不相同。
读已提交这种隔离级别能够解决脏读问题,但是不能解决不可重复读和幻读的问题,它的隔离级别高于读未提交。
C:可重复读
防止脏读和不可重复读,不能处理幻读问题性能比SERIALIZABLE 好。
幻读是在可重复读的事务隔离级别下会出现的一种问题,简单来说,可重复读保证了当前事务不会读取到其他事务已提交的 UPDATE 操作。但同时,也会导致当前事务无法感知到来自其他事务中的 INSERT 或 DELETE 操作,这就是幻读。
在这里插入图片描述
会话B:一切正常。
会话A:在会话B提交事务的前后查询结果是相通的,解决了不可重复读的问题。但是当修改全表数据后再查询就会发现由会话B提交事务添加的一行或者多行数据,产生幻读问题。

D:串行化
不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的性能最差。
如果不能理解,可以在docs窗口下开启两个mysql会话窗口操作(不要在mysql客户端测试,测不出效果,下图中有测试代码),以便加深理解。在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值