MySQL事务特性

数据库事务是一组连续数据操作,在多个数据库进行并发操作数据库的时候,如果不加以控制,会导致数据库出现不可预期的结果,可能造成脏读,不可重读,幻读的可能性。例如两个银行账户A、B.A转金额和B存入金额是两个操作,如果在中途出现异常,如果没有事务管理机制,就会导致不一致性的情况发生,数据丢失。因此事务的特点就有原子性,一致性,隔离性,持久性。一般称为数据库的ACID特性。
Mysql数据库一般使用的引擎为InnoDB和ISAM,InnoDB是支持事务的。事务的原子性要求事务是不能分割的一组操作,要么都执行成功,有么都执行失败,不能允许部分成功的中间状态存在。一致性就是执行结果保持整个数据库的完整性。持久性就是能够保证数据永久存放到磁盘,即是断电也不会丢失。下面重点聊一下隔离性。
事务的隔离性强调了事务之间的影响。一般数据库也支持四种隔离级别:
  1. Read Uncommitted(读未提交)
    一个事务可以看到另一个事务未提交的数据,可能一个事务读取数据的时候,这个数据只是另一个事务操作的中间值。这样会造成脏读的情况。
  2. Read Committed(读已提交)
    这是很多数据库的默认隔离级别,事务可以读取另一个事务提交的结果,A事务操作开始读取某个数据,这个时候另一个B事务修改并提交了该数据的值,A事务在提交的时候再次读取该值发现已经发生了改变,这种情况为不可重读。
  3. Reapeat Read(可重复读)
    数据库一旦开始了一个事务,它读取的值是不会改变的,及时在提交之前其他的事务修改了该数据的值也不会在更新的时候读取到变化后的值,因此可以重复读取。一般的RR隔离级别会出现幻读的情况,幻读就是查询区间数据条数的时候另一个事务如果插入了数据,会读取到新插入的数据,因为可重复读是锁行并不锁表,因此并发的性能还是不错的,幻读的问题在InnoDB中也通过间隙锁的方式得到了解决。达到了与串行化隔离级别同等的效果。
  4. Seriablize(可串行化)
    可串行化是隔离最严格的级别,属于锁表,因此并发性能非常差。
    这里写图片描述

关于隔离级别和并发能力的比较如图:
这里写图片描述
不同的数据库引擎对事物的支持程度也不一样。MySQL支持事务的引擎有InnoDB和NDB。通过多版本并发控制(MVCC,Multiversion Concurrency Control )解决不可重复读问题,间隙锁(也就是并发控制)解决幻读问题。InnoDB的可重复读隔离级别能达到可串行化的效果。

事务的隔离性是锁实现,原子性,一致性和持久性则是日志实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值