事务

事务:一组逻辑操作单元,使数据从一种状态变成另一种状态,这组执行单元要么全部成功,要么全部失败。

  • Atomicity 原子性:事务是一个不可分割的工作单位,事务中的操作要么都执行,要么都不执行。
  • Consistency 一致性:事务必须使数据库从一个一致状态变成另一个一致状态。
  • Isolation 隔离性:一个事务执行不能被其他事务干扰。
  • (一个事务内部的操作,以及使用的数据对其他并发的事务是隔离的,并发执行的各个事务之间不能互相干扰)
  • Durability 持久性:事务一旦提交,则会永久改变数据库的数据。

脏读,不可重复读,幻读

  • 脏读:对于两个事务T1,T2,如果T1读取了已经被T2更新,但是还没有提交的字段,如果T2回滚,那么T1读的数据时无效的。
  • 不可重复读: 对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段。T1再次读取同一个字段,值就不同了。
  • 幻读:对于两个事务T1,T2,T1读取了一个字段,然后T2在表中插入了一些新的行,之后T1再次读取同一个表,就会多出几行。
  • 避免脏读即可。

JDBC开启事务,setAutoCommit方法为false,然后调用commit或者rollback

隔离级别

现在来看看MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。

在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

记住:设置数据库的隔离级别一定要是在开启事务之前!
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 很多人喜欢这篇文章,特此同步过来 由浅入深谈论spring事务 前言 这篇其实也要归纳到《常识》系列中,但这重点又...
    码农戏码阅读 10,214评论 2 59
  • 导语:计算机硬件在飞速发展,数据规模在急速膨胀,但是数据库仍然使用是十年以前的架构体系,WiredTiger 尝试...
    isgiker阅读 8,750评论 0 7
  • 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并...
    CodeKing2017阅读 3,846评论 0 7
  • 数据库中经常被问到四大特性和隔离级别,一般都是涉及到概念性问题,在此做一些整理总结,方便理解。 1、事务的隔离级别...
    Hughman阅读 5,903评论 0 5
  • 1. 梅花 / 王安石 墙角数枝梅,凌寒独自开。 遥知不是雪,为有暗香来。 2. 夏日绝句 / 李清照 生当作人杰...
    汉唐雄风阅读 3,652评论 0 0

友情链接更多精彩内容