简明Mysql事务

事务四大特性

原子性(Atomic):事务中所有操作是不可再分割的原子单位

一致性(Consistency):如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。

隔离性(Isolation):并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。

持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中。

 

事务并发引起的问题以及如何避免

更新丢失:mysql所有数据库隔离级别在数据库层面上均可避免。(现在主流数据库都会自动加锁)

脏读:一个事务修改数据,还未提交,另一个事务读取到未提交的数据。READ-COMMITED事务隔离级别以上可以避免

不可重复读:事务A先读取一条数据,执行逻辑的时候,事务B将这条数据修改了,事务A再次读取的时候,发现数据与上一次读取不匹配。(设置隔离级别REPEATABLE_READS 可以避免)

幻读:在同一事务下,连续执行两次同样的SQL语句第二次的SQL语句可能返回之前不存在的行。

 

事务隔离级别

  谈隔离级别之前,你首先要知道,你隔离得越严实,效率就会越低。

  SQL标准的事务隔离级别包括:

    读未提交(read uncommitted):一个事务还没提交时,它做的变更就能被别的事务看到。

    读提交(read committed):一个事务提交之后,它做的变更才会被其他事务看到。

    可重复读(repeatable read):一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。

    串行化(serializable ):同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到。
读已提交:别人改数据的事务已经提交,我在我的事务中才能读到。
可重复读:别人改数据的事务已经提交,我在我的事务中也不去读。
串行:我的事务尚未提交,别人就别想改数据。

事务隔离的实现

  事务的本质就是给数据库中的数据加锁。

  在MySQL中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。

  

 

 

   使用事务的时候,避免出现长事务。长事务占用锁资源,也可能拖垮整个库。如果无法避免,保证逻辑日志空间足够用,并且支持动态日志空间增长。监控Innodb_trx表,发现长事务报警。

 

Spring事务的七大传播行为

  事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。

REQUIRED(默认):支持使用当前事务,如果当前事务不存在,创建一个新事务。

SUPPORTS:支持使用当前事务,如果当前事务不存在,则不使用事务。

MANDATORY:中文翻译为强制,支持使用当前事务,如果当前事务不存在,则抛出Exception。
REQUIRES_NEW:创建一个新事务,如果当前事务存在,把当前事务挂起。
NOT_SUPPORTED:无事务执行,如果当前事务存在,把当前事务挂起。
NEVER:无事务执行,如果当前有事务则抛出Exception。
NESTED:嵌套事务,如果当前事务存在,那么在嵌套的事务中执行。如果当前事务不存在,则表现跟REQUIRED一样。

格式:@Transactional(propagation = Propagation.REQUIRES_NEW)

posted @ 2020-03-28 15:12  熊猫编程  阅读(115)  评论(0)    收藏  举报