Mysql 事务

IBM MySQL 事务隔离级别和锁
Mysql 默认的隔离级别为什么是repeatable?

1 事务简介

数据库中的事务是一个最小不可分割的单元,可以维护数据库的完整性,它保证一组SQL语句要么同时执行,要么同时不执行。在Mysql中,InnoDB引擎支持数据的事务处理。使用事务处理只能用来管理insert、update和delete语句,既可以执行数据表的更改操作,也可以不执行进行回滚。

2 开启事务

有两种方式开启:

begin;  --第一种方式
start transaction;  --第二种方式

3 提交和回滚

开启事务之后,可以运行想要执行的sql代码,例如insert、update和delete语句等,也可以执行create和drop,但是只有insert、update和delete语句可以进行回滚操作,其他语句均默认提交。执行完commit或rollback后,数据库自动关闭事务。

commit;  --提交
rollback;  --回滚

对于常规的sql语句默认的操作是执行即提交,可以使用如下语句查看当前的提交状态:

select @@autocommit;

如果显示为1,则默认执行即提交,如果显示为0,则为可以手动提交。

+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

4 事务的四大特性(ACID)

  • 原子性(Atomicity):事务是最小的单位,不可以再分割
  • 一致性(Consistency):同一事务的sql语句,必须同时成功或同时失败
  • 隔离性(Isolation):事务1和事务2是隔离的
  • 持久性(Durability):事务一旦结束,不可以返回

5 事务的隔离级别

由于数据库中的存在事务操作,如果在并发的情况下每个事务的不能完全的隔离,即一个事物不应该被另一个事务所干扰,就会出现如下状况:

  • 脏读:A开启事务,执行insert,但没有提交,而B查询到了没有提交的结果。
  • 不可重复读:A查询结果,B开启事务进行修改并提交,A再次查询的结果为B提交以后的,A两次查询不一致。
  • 幻读:A查询结果,B插入或者删除数据,A再次查询的结果不一致。

其中,不可重复读的重点在于修改,而幻读的重点在于新增或删除。针对上述状况,数据库提供了四种隔离级别,分别用不同的锁实现。

  • 读未提交的(read uncommitted):可能会出现脏读、不可重复读、幻读
  • 读已提交的(read committed):可能会出现不可重复读、幻读,不会出现脏读
  • 可以重复读(repeatable read):可能会出现幻读,不会出现脏读和不可重复读
  • 串行化(serializable):不会出现脏读、不可重复读、幻读

四种隔离级别中,串行化(serializable)的级别最高,而读未提交的(read uncommitted)级别最低,大多数数据库的默认隔离级别为读已提交的(read committed),例如Sql Server和Oracle,少数数据库的默认隔离级别为可以重复读(repeatable read),例如Mysql InnoDB的存储引擎。

你可能感兴趣的:(Mysql 事务)