mysql 5.5 版本后存储引擎 InnoDB支持事务
事务(transaction)
事物的特征: ACID
原子性Atomicity: 不可分割, 组成物质的基本单位, 进行数据处理操作的基本单位.
一致性Consistrncy: 数据库在进行事务操作后, 会由原来的一致状态, 变成另一种一致的状态. 也就是说当事务提交后, 或者当事务发生回滚后, 数据库的完整性约束不能被破坏.
隔离性Isolation: 每个事务都是彼此独立的, 不会受到其他事务的执行影响. 也就是说一个事务在提交之前, 对其他事务都是不可见的.
持久性Durability: 事务提交之后对数据的修改是持久性的, 即使在系统出故障的情况下, 比如系统崩溃或者存储介质发生故障, 数据的修改依然是有效的. 因为当事务完成, 数据库的日志就会给被更新, 这是可以通过日志, 让系统恢复到最后一次成功的更新状态.
原子性是基础, 隔离性是手段, 一致性是约束条件, 持久性是目的.
常用控制语句
START TRANSACTION 或者 BEGIN, 显式开启一个事务
COMMIT: 提交事务. 当提交事务后, 对数据库的修改事务是永久性的.
ROLLBACK 或者 ROLLBACK TO [SAVEPOINT], 回滚事务. 撤销正在进行的所有没有提交的修改, 或者将事务回滚到某个保存点.
SAVEPOINT: 在事务中创建保存点, 方便后续针对保存点进行回滚. 一个事务中可以存在多个保存点.
RELEASE SAVEPOINT: 删除某个保存点
SET TRANSACTION: 设置事务的隔离级别
mysql> set autocommit =0 //关闭自动提交
mysql> set autocommit = 1//开启自动提交
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;
CREATE TABLE test1(name varchar(255), PRIMARY KEY(name)) ENGINE = InnoDB;
SET @@completion_type = 1;
BEGIN;
INSERT INTO test1 SELECT '关羽';
COMMIT;
INSERT INTO test1 SELECT '张飞';
INSERT INTO test1 SELECT '张飞';
ROLLBACK;
SELECT * FROM test1;
事务隔离
通过设置不同的隔离等级, 以便在正确性和效率之间进行平衡.
事务并发处理可能存在的三种异常?脏读, 不可重复读和幻读?
脏读: 还没有提交事务, 就可读到加入的事务信息. 读取了其他事务还没有提交的数据.
不可重复读: 同一条记录, 两次读取的结果不同. 这是因为有其他事务对这个数据同时进行了修改或删除.
幻读: 事务A根据条件查询得到了N条数据, 但此时事务B更改或者增加了M条符合事务A查询条件的数据, 这样当事务A再次进行查询的时候会发现有N+M条数据.
针对可能存在的异常情况, 四种事务隔离的级别分别是什么?
隔离级别:
读未提交 允许脏读 允许不可重复读 允许幻读
读已提交 禁止 允许 允许
可重复读 禁止 禁止 允许
可串行化 禁止 禁止 禁止
网友评论