事务处理 commit rolllback

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条数据.

针对可能存在的异常情况, 四种事务隔离的级别分别是什么?

隔离级别:

读未提交 允许脏读 允许不可重复读 允许幻读

读已提交    禁止            允许                允许

可重复读    禁止            禁止                允许

可串行化    禁止            禁止                禁止

你可能感兴趣的:(事务处理 commit rolllback)