Mysql事务

mysql事务主要用于处理数据量大,比较复杂的数据。

事务就是为了保证一组数据库操作,要么全部成功,要么全部失败。

说到事务,就不得不说 ACID 特性(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)。

Atomicity原子性:

一个事务中的多组操作,要么全部成功,要么全部失败,事务commit(提交)成功之后,所有操作都生效,提交失败,所有都不生效。

Consistency一致性:

在事务开始和结束的时候,数据库的完整性没有被破坏,这表示,写入的资料与预期完全符合规则,一个事务执行之前和执行之后数据库都必须处于一致性状态。

Isolation隔离性:

数据库有多个并发事务同时进行读写的能力,隔离性可以保证多个事务之间交叉执行导致不一致。

隔离级别:

当数据库多个并发事务同时执行时,就容易出现脏读,幻读,不可重复读等问题;

脏读:在事务A执行时,对资源进行修改,此时事务B读取了A修改后的数据;

幻读:两个事务同时读取一个范围的数据,事务A两次读取了这个范围,过程中事务B了数据,此时A后一次读取的数据有比第一次读取多的行。

不可重复读:事务B读取两次资源,事务A在期间修改了数据,导致两次读出的数据不一致;

隔离级别就是为了解决以上问题,主流的数据库都提供四种隔离级别,从低到高依次是:读未提交,读已提交,可重复读,串行化。mysql默认是可重复读

读未提交:最低隔离级别,所有的事务都能看到其他未提交事务的执行结果,不能防止脏读,可重复读,幻读。所以很少会用到。

读已提交:事务提交以后才会被看到,但未提交前数据库发生的变更当前事务也可以看到,可以防止脏读,不能解决不可重复度,幻读。

可重复度:mysql默认的隔离级别,一个事务多次读取同一个数据,这个事务没结束前,其他事务不能访问该数据,这样就能解决脏读,不可重复读的问题,但是还是会幻读。

串行化:最高的隔离级别,事务只能一个接一个的执行,一系列的操作会加锁,读写都会加锁,锁释放之前,所有事务都不能对这一行记录进行操作,必须等之前的事务执行完毕,在这个级别,可以解决上面提到的所有并发问题,但会导致大量超时现象,锁竞争,一般不用这个隔离级别。

隔离级别实现原理

数据库中会创建一个视图,在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。在“读提交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。这里需要注意的是,“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;而“串行化”隔离级别下直接用加锁的方式来避免并行访问。

在 MySQL 中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。

回滚日志什么时候删除呢,系统中没有比这个回滚日志更早的 read-view 时,这个回日志就会被删除。
因此不建议使用长事务,容易导致回滚日志太多,大量占用存储空间。

事务的启动方式

  • 显式启动:begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback
  • 也可以使用 set autocommit=0,此时不需要显式启动,比如执行了一个select语句就直接启动了事务,但是需要再执行一条commit来提交;

因此建议设置set autocommit=1,此时需要用begin来开启事务,如果觉得多了一次交互,比较麻烦的话,也可以使用commit work and chain,表示提交当前事务,并且再启动一个新的事务,这样就只有一次begin了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值