mysql事务、脏读、幻读

什么是事务?

百度百科

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transactionend transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

事务是恢复和并发控制的基本单位。

事务通常以begin(start) transaction 开始,以commit 或 rollback 结束。 
commit 表示提交,将事务中所有对数据库的更新写到磁盘,事务正常结束。 
rollback表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有已完成的操作全部撤消,滚回到事务开始的状态。

事务包括哪些属性?

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性

  • 原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
  • 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  • 隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

其中比较重要的就是事务的隔离性,尤其是在高并发情况下,需要深入理解隔离性。

事务的隔离性有哪些级别?

隔离性就是指在并发情况下,不同事务对同一个数据的隔离水平。SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。mysql有四种隔离级别。

  1. 读未提交(Read Uncommitted):事务A可以读取到事务B未提交的数据,引发脏读。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。
  2. 读已提交(Read Committed):事务A只能看到事务B提交后的数据。会导致不可重复读(即同一事务执行完全相同的select语句时可能看到不一样的结果,导致这种情况的原因可能有:(1)有一个交叉的事务有新的commit,导致了数据的改变;(2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit,多个commit提交时,只读一次出现结果不一致)。这是大多数数据库默认的隔离级别,但mysql默认是RR。
  3. 可重复读(Repeatable Read):保证同一事务的多个并发实例看到的数据是一致的。这是mysql默认的隔离级别。但此级别可能出现的问题--幻读(Phantom Read),当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行,行数不一致。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制来解决幻读问题。
  4. 可串行化(Serializable):这是最高的隔离级别。它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它在每个读的数据行上加上共享锁。可能导致大量的超时现象和锁竞争。

äºå¡

什么是脏读、幻读和不可重复读?

  • 脏读:脏读是指一个事务读取到其他事务没有提交的数据。如果未提交的数据所在的事务执行了回滚,那么就会出现数据错误。
  • 幻读:幻读是指一个事务内多次根据同一条件查询出来的记录行数不一致。
  • 不可重复读:不可重复读是指一个事务内多次根据同一查询条件查询出来的同一行记录的值不一致。

mvcc多版本并发控制机制

 

mysql的innodb引擎默认支持的是可重复读,但仍然存在幻读问题。具体分析参考这篇博客。 

参考:https://blog.csdn.net/lonely_bin/article/details/96175384

@Transactional注解 https://baijiahao.baidu.com/s?id=1661565712893820457&wfr=spider&for=pc

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值