在MySQL5.5以前, 默认的存储引擎是MyISAM, 在5.5版本以后默认存储引擎是InnoDB, 而这两个存储引擎的最大区别就在于InnoDB是支持事务的, 这也是InnoDB取代MyISAM的重要缘由. 什么是事务呢? 事务的英文是transaction, 也就是进行一次处理的基本单元, 要么彻底执行, 要么全都不执行.数据库
深刻理解事务, 就须要知道事务的四个特性, 那就是ACID:编程
这四个特性中, 原子性是基础, 隔离性是手段, 一致性是约束条件, 持久性是目的. 原子性和隔离性好理解, 至于一致性相对难, 笔者开始老是不知道这个一致性所说的状态是什么意思, 直到如今看了这个文档, 才发现.服务器
一致性自己是由具体的业务定义的, 任何写入数据库中的数据都须要知足咱们事先定义的约束规则, 到这里就能够理解一致性具体的含义了, 一致性其实说的是不违反约束规则, 好比主键约束, 惟一约束, 不为NULL约束等等.日志
另外一个持久性, 持久性是经过事务日志来保证的. 日志包括了回滚日志和重作日志. 经过事务对数据进行修改的时候, 首先会将数据库的变化信息记录到重作日志中, 而后再对数据库中对应的行进行修改, 这样作的好处是, 即便数据库崩溃, 数据库重启后也能找到没有更新到数据库系统中的重作日志, 从新执行, 从而使事务具备持久性.code
Oracle是支持事务的, 而在MySQL中, 须要选择合适的存储引擎才能够支持事务, 使用MySQL, 可使用SHOW ENGINES
来查看当前MySQL支持的存储引擎, 以及该引擎是否支持事务.blog
事务经常使用的控制语句:事务
使用事务有两种方式, 一种是隐式事务, 一种是显示事务. 隐式事务其实就是自动提交. Oracle默认不自动提交, 须要手写COMMIT命令, 而MySQL默认自动提交, 可使用MySQL的命令来配置参数关闭自动提交:set autocommit = 0;是关闭自动提交, set autocommit = 1;是开启自动提交
.ci
MySQL的默认状态下:文档
CREATE TABLE test(name varchar(255), PRIMARY KEY (name)) ENGINE=InnoDB; BEGIN; INSERT INTO test SELECT '关羽'; COMMIT; BEGIN; INSERT INTO test SELECT '张飞'; INSERT INTO test SELECT '张飞'; ROLLBACK; SELECT * FROM test;
CREATE TABLE test(name varchar(255), PRIMARY KEY (name)) ENGINE=InnoDB; BEGIN; INSERT INTO test SELECT '关羽'; COMMIT; INSERT INTO test SELECT '张飞'; INSERT INTO test SELECT '张飞'; ROLLBACK; SELECT * FROM test;
INSERT INTO test SELECT '张飞';
的时候, 执行完成就会提交, 只有在执行第二个的时候会产生主键冲突而回滚.CREATE TABLE test(name varchar(255), PRIMARY KEY (name)) ENGINE=InnoDB; SET @@completion_type = 1; BEGIN; INSERT INTO test SELECT '关羽'; COMMIT; INSERT INTO test SELECT '张飞'; INSERT INTO test SELECT '张飞'; ROLLBACK; SELECT * FROM test;
结果是一条数据, 很明显, 缘由是SET @@completion_type = 1;
, 这个参数有3种可能:it
这里使用了completion=1, 就是提交以后, 至关于在下一行写了START TRANSACTION 或 BEGIN, 这是插入两次张飞会被认为是在同一个事务以内的操做, 因此回滚以后, 数据库中就只有一条关羽的数据.
这个是事务的基本认识, 固然事务的隔离级别也很重要, 下一个随笔说.