事务处理

来源:互联网 发布:易建联 nba 知乎 编辑:程序博客网 时间:2024/05/16 00:31

1. ACID

  • 原子性(Automic)

    一个事务被视为一个不可分割的最小工作单位,整个事务的操作要么全部提交成功,要么全部失败回滚。

  • 一致性(Consistency)

    数据库总是从一个一致性状态切换到另一个一致性的状态。只要事务最终没有提交,中间做的修改都不会保存到数据库。

  • 隔离性(Isolation)

    一个事务所做的修改在没有提交之前,是不会被其他事务所看到的。

  • 持久性(Durability)

    一旦事务提交,所做的修改就会永久保存到数据库中。

2. 隔离级别

  • 未提交读(Read Uncommitted)

    事务中的修改,即使没有提交,对其他事务也是可见的,事务可以读取未提交的数据,被称为脏读。这个级别会导致很多问题,一般很少用。

  • 提交读(Read Committed)

    一个事务开始时,只能看到已经提交的事务所做的修改。也就是说一个事务从开始到提交之前,所做的任何修改对其他事务不可见。

  • 可重复读(Repeatable Read)

    解决了脏读问题,保证在同一个事务中多次读取同样记录的结果是一致的。但无法解决幻读(当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新记录,当之前的事务再次读取该范围内的记录时,会产生幻行)问题。

    InnoDB通过MVCC解决了幻读问题,可重复读是MySQL的默认事务隔离级别。

  • 可串行化(Serializable)

    强制事务串行执行,避免了前面说的幻读问题,该级别会在读取的每一行数据上都加锁,所以可以导致大量的超时和锁争用的问题,实际开发很少使用该级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下才使用。

总而言之,使用MySQL默认的隔离级别(可重复读)就好了。

3. 自动提交

如果不是显式地开始一个事务,则每个查询都被当做一个事务执行提交操作。MySQL默认采用自动提交模式。可以在当前连接设置AUTOCOMMIT变量来启用或禁用自动提交模式。

SET AUTOCOMMIT = 1;

1或ON表示启用,0或OFF表示禁用。

原创粉丝点击