Mysql的事务

MySQL


事务

事务用于保证数据的一致性,它由一组相关的dml(数据操作语言 增删改)语句组成

该组的dml语句要么全部成功,要么全部失败。

-- 1. 创建一张测试表
CREATE TABLE t27
	( id INT,
	  `name` VARCHAR(32));
	  
-- 2. 开始事务
START TRANSACTION 

-- 3. 设置保存点
SAVEPOINT a

-- 执行dml 操作
INSERT INTO t27 VALUES(100, 'tom');
SELECT * FROM t27;

SAVEPOINT b
-- 执行dml操作
INSERT INTO t27 VALUES(200, 'jack');

-- 回退到 b
ROLLBACK TO b

-- 继续回退 a
ROLLBACK TO a

-- 如果这样, 表示直接回退到事务开始的状态.
ROLLBACK 

COMMIT

事务和锁

当执行事务操作时(dml语句),mysql会在表上加锁, 防止其它用户改表的数据

事务的几个重要操作

  1. start transaction --开始一个事务
  2. savepoint 保存点名–设置保存点
  3. rollback to 保存点名–回退事务
  4. rollback --回退全部事务
  5. commit – 提交事务,所有的操作生效,不能回退

回退事务

保存点(savepoint)是事务中的点,用于取消部分事务

当结束事务时(commit),会自动的删除该事务所定义的所有保存点

当执行回退事务时,通过指定保存点可以回退到指定的点


提交事务

使用commit语句可以提交事务,当执行了commit语句子后

会确认事务的变化、结束事务、删除保存点、释放锁,数据生效。

当使用commit语句结束事务后,其它会话[其他连接]将可以查着到事务变化后的新数据[所有数据就正式生效]


注意

  1. 如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
  2. 如果开始一个事务,你没有创建保存点,你可以执行rollback,默认就是回退到你事务开始的状态
  3. 你可以在事务没有提交前,选择回退到哪个保存点
  4. mysql的事务机制需要innodb的存储引擎才可以使用,myisam不好使
  5. 开始一个事务start transaction或者可以写 set autocommit=off
-- 1. 如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
INSERT INTO t27 VALUES(300, 'milan'); -- 自动提交 commit

SELECT * FROM t27


-- 2. 如果开始一个事务,没有创建保存点. 你可以执行 rollback,
-- 默认就是回退到你事务开始的状态
START TRANSACTION 
INSERT INTO t27 VALUES(400, 'king');
INSERT INTO t27 VALUES(500, 'scott');
ROLLBACK -- 表示直接回退到事务开始的的状态
COMMIT;

-- InnoDB 存储引擎支持事务 , MyISAM 不支持




事务隔离

多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作

以保证各个连接在获取数据时的准确性。(通俗解释:每一个事务看到同一张表的数据不一样)

如果不考虑隔离性,可能会引发如下问题:

  • 脏读(dirty read):当一个事务读取另一个事务尚未提交的改变(update,insert,delete)时,产生脏读。(未commit)
  • 不可重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读。(已commit)
  • 幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。(已commit)

事务隔离级别

概念: Mysql隔离级别定义了事务与事务之间的隔离程度。

加锁会在其他线程操作数据库时,不操作数据库,自己卡住,等待其他线程commit后才进入数据库。

-- 1. 开了两个mysql的控制台
-- 2. 查看当前mysql的隔离级别
SELECT @@tx_isolation;

-- mysql> SELECT @@tx_isolation;
-- +-----------------+
-- | @@tx_isolation  |
-- +-----------------+
-- | REPEATABLE-READ |
-- +-----------------+

-- 3.把其中一个控制台的隔离级别设置 Read uncommitted

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

-- 4. 创建表
CREATE TABLE `account`(
	id INT,
	`name` VARCHAR(32),
	money INT);
	

-- 查看当前会话隔离级别 
SELECT @@tx_isolation
-- 查看系统当前隔离级别
SELECT @@global.tx_isolation
-- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 设置系统当前隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL [你设置的级别]

设置事务隔离级别

  1. 查看当前会话隔离级别

    select @@tx_isolation;
    
  2. 查看系统当前隔离级别

    select @@global.tx_isolation;
    
  3. 设置当前会话隔离级别

    set session transaction isolation level repeatable read;
    
  4. 设置系统当前隔离级别

    set global transaction isolation level repeatable read;
    
  5. mysql默认的事务隔离级别是 repeatable read,一般情况下,没有特殊
    要求,没有必要修改(因为该级别可以满足绝大部分项目需求)

如果想要修改默认隔离级别,可以全局修改,修改my.ini配置文件,在最后加上

#可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ,SERIALIZABLE.
[mysqld]
transaction-isolation = REPEATABLE-READ

事务特性

  • 原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

  • 一致性(Consistency)
    事务必须使数据库从一个二致性状态变换到另外一个一致性状态

  • 隔离性(lsolation)
    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

  • 持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响





存储引擎


MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MylSAMinnoDBMemory

MySQL 数据表主要支持六种类型,分别是: BDBHEAPISAMMERGEMYISAMInnoBDB

这六种又分为两类一类是”事务安全型”(transaction-safe) 支持事务,比如: InnoDB,其余都属于第二类,称为”非事务安全型”(non-transaction-safe) 不支持事务 [mysiammemory].

注意:

  1. MylSAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求
  2. InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MylSAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
  3. MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦MySQL服务关闭,表中的数据就会丢失掉, 表的结构还在。

存储引擎使用

-- 查看所有的存储引擎
SHOW ENGINES
-- innodb 存储引擎,是前面使用过.
-- 1. 支持事务 2. 支持外键 3. 支持行级锁

-- myisam 存储引擎
CREATE TABLE t28 (
	id INT,
	`name` VARCHAR(32)) ENGINE MYISAM
-- 1. 添加速度快 2. 不支持外键和事务 3. 支持表级锁

START TRANSACTION;
SAVEPOINT t1
INSERT INTO t28 VALUES(1, 'jack');
SELECT * FROM t28;
ROLLBACK TO t1

-- memory 存储引擎
-- 1. 数据存储在内存中[关闭了Mysql服务,数据丢失, 但是表结构还在] 
-- 2. 执行速度很快(没有IO读写) 3. 默认支持索引(hash表)

CREATE TABLE t29 (
	id INT,
	`name` VARCHAR(32)) ENGINE MEMORY
DESC t29 -- 表结构还在
INSERT INTO t29
	VALUES(1,'tom'), (2,'jack'), (3, 'hsp');
SELECT * FROM t29

-- 指令修改存储引擎
ALTER TABLE `t29` ENGINE = INNODB

修改存储引擎

ALTER TABLE `表名` ENGINE = 储存引擎;

你可能感兴趣的:(mysql,数据库,oracle)