事务

事务的四个固有特点

  1innodb支持事务、MyISAM不支持事务,因为这两个引擎是MySQL使用较多的两个引擎

  2、事务在语法上就是start transaction;dmlselect;commit;(rollback)

  3、事务的核心就是ACID,简单就是事务的原子性、事务一致性、事务的隔离性、事务的持久性

  4、事务的原子性说的是组成事务的一组SQL语句,一般代表着一个业务,一个业务一般对应着一组DMLselect语句,这一组SQL语句,要么都成功、要么都失败,不允许部分成功、部分失败,也就是说这一组SQL语句是一个原子,不能被分割。事务执行过程中,不管数据库是否出现故障,都能保证所有的SQL,要么都成功,要么都失败。

  5、事务的一致性,也是依托于上面的事务的原子性,对于事务来说,要求开发人员要清晰的知道哪些SQL对应着一个原子业务,很多开发人员忽视这个问题,将一个原子业务分割成多个事务来执行,很容易造成业务数据不一致,这个取决于开发人员的业务要求。

  6、事务的隔离性,一个未提交事务不能被其他线程或者事务看到,因为未提交就意味着可能回滚,如果能够被别人看到,别人可能依照这个数值进行计算。

  7、事务的持久性,数据库保证一定事务提交,这个事务就不会丢失,不会因为数据库的崩溃而丢失事务

事务的隔离级别--tx_isolation

  1、未提交读,这个基本上不会被使用,因为违反事务的隔离性,特别是在OLTP系统中,几乎不会用到

  2、已提交读,对于未提交事务,保证不会被其他线程读取到,这个满足事务的隔离性,对于innodb来说,通过undo和行锁来实现,已提交读是Orale的默认隔离级别,低于MySQL来说,这个隔离级别会出现幻影读,也就是在一个事务中,不同时间段读取相同的数据行,可能得到不同的结果,甚至于行数都不同。一般的交易系统,已提交读可以满足需要,可以考虑将事务的隔离级别设置成已提交读,会提升系统的性能和并发性

  3、可重复读,这是MySQL Innodb的默认隔离级别,在同一个事务中,不同时间段,相同的条件读取数据,得到的结果是一致的对于select来说,通过MVCC来实现对于DML来说,通过gap锁来实现。

    可重复读固然带来了事务的很好的隔离性,但是存在下面的问题。

    1、因为MVCC的原因,如果如果出现长事务,会导致UNDO空间持续增长,甚至于暴增。

    2、因为gap锁,降低了事务的并发性,因为gap,锁定的是一个范围,甚至于锁定了整个表的数据行

    3、序列化,这个隔离级别基本上不会被采用,因为在同一个时刻只运行一个事务存在,即使这些事务修改不同的数据,几乎没有并发性,这个完满不满足OLTP的并发性要求,也没有必要,运维可重复读已经解决了事务互相干扰的问题

    4、对于事务的隔离级别可以考虑调整成已提交读,这样可以避免MVCC带来的undo负载以及避免gap

原文地址:https://www.cnblogs.com/5945yang/p/11259167.html