MySQL事务

事务的特性

  1. 原子性:指事务中包含的所有操作要么都做,要么都不做,保证数据库是一致的。甲账户向乙账户转账1000块,则甲账户就先减少1000块,而后乙账户就增加一千块,这两个动作要么都提交,要么都回退,不能发生一个操作生效,另一个失效。
  2. 一致性:指数据库中数据在事务操作前后必须都满足业务规则约束。例如甲乙账户总金额在转账前后必须一致,如有不一致,则必须是短暂的,且只有在事务提交前才会出现。
  3. 隔离性:指数据库允许多个并发事务同时对数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。甲乙之间转账时,丙同时向甲转账,若同时进行,则甲乙之间的一致性不能得到满足。所以在甲乙事务执行的过程中,其他事务不能访问或修改当前的相关值。
  4. 持久性:事务处理结束后,对数据的修改就是永久的,即便系统发生故障也不会丢失。

 

事务就是一组DML(insert,update,delete)语句的集合。MySQL数据库InnoDB存储引擎支持事务,但MyISAM不支持。

 

事务默认开启的语句是由begin或者start transaction(read write|read only)命令来开启的,或者把自动提交特性关闭,使用set autocommit=0。

事务结束语句通常使用commit和rollback显示结束,前者是提交,后者是回滚。

隐式提交可以是再执行一直begin或者start transaction(read write|read only)命令,隐式回滚可以退出会话、连接超时或者关机。

隐式的回滚可以是在插入语句后,执行exit命令退出会话,重新进入数据库会发现数据并没有插入。

MySQL的事务自动提交模式是默认启动的autocommit=1。

 

事务的隔离级别

MySQL InnoDB存储引擎实现SQL标准的四种隔离级别。

通过show variables like '%tx_isolation%'查看当前数据库的隔离级别。

目前数据库版本默认隔离级别是REPEATABLE-READ

  1. 读未提交(read uncommitted),简称RU——在其中一个事务中,可以读取到其他事务未提交的数据变化。这种读取其他绘画还没提交的事务,叫做脏读,生成环境不建议使用。
  2. 读已提交(read committed),简称RC——在其中一个事务中,可以读取到其他事务已经提交的数据变化。这种读取叫做不可重复读,也可以叫做幻读,是Oracle的默认事务隔离级别。
    不可重复读是指在其中一个事务中,读取到了其他事务针对旧数据的修改记录,常见update和delete操作。
    幻读是指在其中一个事务中,读取到了其他事务新增数据,常见insert操作。
  3. 可重复度(respetable read),简称RR——它是MySQL的默认事务隔离级别。在其中一个事务种,直到事务结束前,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,避免了前两种的现象发生。
  4. 串行(serializable),在每个读的数据行上都需要加表级共享锁,在每次写数据时都要加表级排他锁。这就会造成InnoDB的并发能力下降,大量的超时和锁竞争就会发生,生产环境不建议使用。

针对于可重复读的一个特点进行设置,A会话中将自动提交关闭,打开B会话查询A会话的记录,A插入一条不提交,B读取,读取不到。A提交事务,B再读取才能读取到。当B想知道A是否有未提交的事务,在select语句后添加for update就能一直等待A会话的最新数据了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值