数据库事务特性

84 阅读3分钟

数据库事务特性

一、什么是事务

事务是一系列对系统中数据进行查询和更新的操作所组成的执行逻辑单元。

二、事务的特性

  1. 原子性(Atomicity):事务必须是一个原子的操作单元。其中任何一项操作失败必将导致整个事务的失败。简而言之,“一荣俱荣,一损俱损”。
  2. 一致性(Consistency):事务的执行结果必须使数据库从一种一致性状态转变成另一种一致性状态。
  3. 隔离性(Isolation):在并发环境中,并发的事务必须是相互隔离的,一个事务的执行不能被其他事务所干扰。
  4. 持久性(Durability):事务一旦被提交就会写入磁盘被永久保存,即使宕机只要数据库能正常启动数据都会被恢复。

三、事务的隔离级别

1. 读未提交

事务中的修改,即使没有提交也会被其他事务读取到。会产生脏读,有很严重的数据安全问题

image.png

读未提交引发脏读问题: 事务A执行购买商品业务, 目前账户扣减和库存扣减已经完成;此时,事务B恰巧来读取库存数量,读取到已扣减的库存数量,但是事务A在生成订单的时候存现异常,事务执行了回滚操作,库存扣减又被加回去,就导致事务B读取的库存数量与实际不符。

2.读已提交

一个事务在执行期间只能读取到其他事务已经提交的数据,其他事务未提交的数据是不能看到的。读已提交解决了脏读问题但是没有解决不可重复读的问题

image.png

读已提交引发不可重复读问题: 事务A执行购买商品业务,目前账户扣减和库存扣减已经完成;此时,事务B恰巧来读取库存数量,第一次读取到已扣减的库存数量,但是事务A在生成订单的时候存现异常,事务执行了回滚操作,库存扣减又被加回去,此次事务B又对库存数量进行了第二次读取。 这样就导致两次读取的数据不一致。

3.可重复读

保证了一个事务在执行期间多次读取同一数据的结果是是一致的。可重复读解决了不可重复读问题但是没有解决幻读的问题。

image.png

可重复读引发幻读问题: 事务A执行新增业务,先对数据库进行查询,查询发票111不存在,然后执行其他相关业务操作,此时,事务B,直接新增了发票111,并提交了事务,事务A在处理完其他业务操作后,准备新增发票111,但是发现新增失败,发现数据库已经存在了发票111,就导致了事务A明明查询是没有发票111可以插入但是在查询的时候发票111却存在,就好像出现幻觉一样。

4.序列化

又称串行化,就是强制事务串行执行,一个事务必须等到上一个事务执行完成才能够执行。能够解决幻读、不可重复读、以及幻读问题,但是会产生很大的性能问题。

序列化不会产生上述的脏读。不可重复读以及幻的问题,因为串行化顾名思义就是按照事务的提交的先后串行执行,也就不存在并发问题,但是相对的性能也是最差的。

四、mysql数据库隔离级别的支持

mysql默认是可重复读(Repeatable read),mysql的Innodb引擎默认是支持数据库事务的。

image.png

客户端如何查看数据库引擎是否支持事务?

show engines;

image.png