事务用于保证数据的一致性,它由一组相关的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会在表上加锁, 防止其它用户改表的数据
事务的几个重要操作
start transaction
--开始一个事务savepoint
保存点名–设置保存点rollback to
保存点名–回退事务rollback
--回退全部事务commit
– 提交事务,所有的操作生效,不能回退保存点(savepoint
)是事务中的点,用于取消部分事务
当结束事务时(commit
),会自动的删除该事务所定义的所有保存点
当执行回退事务时,通过指定保存点可以回退到指定的点
使用commit
语句可以提交事务,当执行了commit
语句子后
会确认事务的变化、结束事务、删除保存点、释放锁,数据生效。
当使用commit
语句结束事务后,其它会话[其他连接]将可以查着到事务变化后的新数据[所有数据就正式生效]
注意
rollback
,默认就是回退到你事务开始的状态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 不支持
多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作
以保证各个连接在获取数据时的准确性。(通俗解释:每一个事务看到同一张表的数据不一样)
如果不考虑隔离性,可能会引发如下问题:
事务隔离级别
概念: 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 [你设置的级别]
设置事务隔离级别
查看当前会话隔离级别
select @@tx_isolation;
查看系统当前隔离级别
select @@global.tx_isolation;
设置当前会话隔离级别
set session transaction isolation level repeatable read;
设置系统当前隔离级别
set global transaction isolation level repeatable read;
mysql默认的事务隔离级别是 repeatable read
,一般情况下,没有特殊
要求,没有必要修改(因为该级别可以满足绝大部分项目需求)
如果想要修改默认隔离级别,可以全局修改,修改my.ini
配置文件,在最后加上
#可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ,SERIALIZABLE.
[mysqld]
transaction-isolation = REPEATABLE-READ
原子性(Atomicity
)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
一致性(Consistency
)
事务必须使数据库从一个二致性状态变换到另外一个一致性状态
隔离性(lsolation
)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
持久性(Durability
)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MylSAM
、innoDB
、Memory
等
MySQL 数据表主要支持六种类型,分别是: BDB
、HEAP
、ISAM
、MERGE
、MYISAM
、InnoBDB
这六种又分为两类一类是”事务安全型”(transaction-safe) 支持事务,比如: InnoDB
,其余都属于第二类,称为”非事务安全型”(non-transaction-safe
) 不支持事务 [mysiam
和memory
].
注意:
MylSAM
不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求InnoDB
存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MylSAM
存储引擎,InnoDB
写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。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 = 储存引擎;