1. mysql 事务
1.1 什么是事务
事务用于保证数据的一致性,它由一组相关的dml语句组成该组的dml语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。
2. 事务和锁 796-797
当执行事务操作时(dml语句) ,mysql会在表 上加锁,防止其它用户改表的数据.这对用户来讲是非常重要的
2.1 演示
●mysql 数据库控制台事务的几个重要操作(基本操作transaction.sql)
1. start transaction --开始一个事务
2.savepoint保存点名--设置保存点
3. rollback to保存点名--回退事务
4. rollback --回退全部事务
5.commit --提交事务,所有的操作生效,不能回退
代码在E:\java学习\初级\course163\db_
transction_
#事务的一个重要概念和具体操作 797
-- 创建一张测试表
CREATE TABLE t27(
id INT,
`name` VARCHAR(32));
-- 开始事务
START TRANSACTION
-- 设置保存点
SAVEPOINT a
-- 执行dml操作
INSERT INTO t27 VALUES(100,'tom')
-- 在设置一个保存点
SAVEPOINT b
-- 再次执行dml操作
INSERT INTO t27 VALUES(200,'tom')
SELECT * FROM t27
-- 回退到b
ROLLBACK TO b
SELECT * FROM t27
-- 回退到a
ROLLBACK TO a
SELECT * FROM t27
-- 如果这样ROLLBACK(不加to), 表示直接回退到事务开始的状态
ROLLBACK
COMMIT
2.2 细节:
1.没有设置保存点
2.多个保存点
3.存储引擎
4.开始事务方式
3. 回退事务 797
在介绍回退事务前,先介绍一 下保存点(savepoint).保存点是事务中的点.用于取消部分事务,当结束事务时(commit) ,会自动的删除该事务所定义的所有保存点当执行回退事务时,通过指定保存点可以回退到指定的点,这里我们作图说明
4. 提交事务 797
使用commit语句可以提交事务.当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,数据生效。当使用commit语句结束事务子后,其它会话[其他连接]将可以查看到事务变化后的新数据([所有数据就正式生效.]
5. 事务细节讨论 798
1.如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
2.如果开始一个事务,你没有创建保存点.你可以执行rollback,默认就是回退到你事务开始的状态
3.你也可以在这个事务中(还没有提交时),创建多个保存点比如: savepoint aaa;执行 dml , savepoint bbb;
4.你可以在事务没有提交前,选择回退到哪个保存点
5. mysqI的事务机制需要innodb的存储引擎才可以使用,myisam不好使.
6.开始一个事务start transaction, set autocommit= off;
代码在E:\java学习\初级\course163\db_
transction_detail
# 讨论事务细节 798
-- 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-- 表示直接回退到事务开始的状态
SELECT * FROM t27
COMMIT
-- 3.你也可以在这个事务中(还没有提交时),创建多个保存点
-- 比如: savepoint aaa;执行 dml , savepoint bbb;
-- 4.你可以在事务没有提交前,选择回退到哪个保存点
-- 5. mysqI的事务机制需要innodb的存储引擎才可以使用,myisam不好使.
-- InnoDB 存储引擎支持事务 , MyISAM 不支持
-- 6.开始一个事务start transaction, set autocommit= off;
SET autocommit=off
6. mysql 事务隔离级别 799
6.1 事务隔离级别介绍 799
1. 多个连接开启各自事务操作数据库P数据时,数据库系统要负
责隔离操作,以保证各个连接在获取数据时的准确性。(通俗解释)
2.如果不考虑隔离性,可能会引发如下问题:
➢脏读
➢不可重复读
➢幻读
6.2 查看事务隔离级别 799-801
脏读(dirty read):当一个事务读取另一个事务尚未提交的改变(update,insert,delete)时,产生脏读
不可重复读(nonrepeatable read):同查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读。
幻读(phantom read):同查询在同事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。
说明:我们待会举例一个案例来说明mysql的事务隔离级别.以对account表的操作来说明.上面的几种情况.
我来做个通俗化解释,脏读就是有两个客户同时访问数据库时,a客户在对表进行操作,但是没有commit提交,这是b客户select就能看到a刚刚的操作,不可重复读和幻读其实差不多,不可重复读主要是针对修改或删除操作,幻读是针对插入操作,大概意思就是,a对表在进行插入或修改或删除操作后也commit了,但是b同样可以访问select到b的操作结果,这就是不可重复读和幻读,为什么这么说呢,大家觉得挺正常的,其实则不然,因为b访问表时。那时的表的数据还没有被改变,人家就是想要那时的数据,但是经过a这么一操作,表的数据改变了,b就读不到想读到的那时的数据了
6.3 事务隔离级别 799-801
概念:Mysq隔离级别定义了事务与事务之间的隔离程度。
6.4 mysql 的事务隔离级--案例 800-801
我们举例一个案例来说明mysql的事务隔离级别.以对account表进行操作为例。(id, name, money)
代码在E:\java学习\初级\course163\db_
set_transaction
#演示mysql事务的隔离级别 800
-- 开了两个mysql的控制台
-- 查看mysql的隔离级别
SELECT @@tx_isolation;
-- mysql> SELECT @@tx_isolation;
-- +-----------------+
-- | @@tx_isolation |
-- +-----------------+
-- | REPEATABLE-READ |
-- +-----------------+
-- 把其中一个控制台的隔离级别设置 Read uncommitted(读未提交)
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 两个控制台都开启事务
-- 创建表
CREATE TABLE `account`(
id INT,
`name` VARCHAR(32),
money INT);
-- 在其中一个控制台添加数据
INSERT INTO ACCOUNT VALUES(100,'tom',1000);
-- 然后在另一个控制台查看可以发现出现 脏读
SELECT * FROM ACCOUNT
-- 在其中一个控制台修改数据,会出现不可重复读
UPDATE ACCOUNT SET money = 800 WHERE id = 100;
-- 在其中一个控制台添加数据,会出现幻读
INSERT INTO ACCOUNT VALUES(200,'jack',2000);
-- 提交
COMMIT
-- 后面的具体操作看视频 800
6.5 设置事务隔离级别 802
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
代码在E:\java学习\初级\course163\db_
set_transaction
-- 设置事务隔离级别 802
-- 1.查看当前会话隔离级别
SELECT @@tx_isolation
-- 2.查看系统当前隔离级别
SELECT @@global.tx_isolation
-- 3. 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 4.设置系统当前隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL[你需要设置的级别]
-- 5. mysql 默认的事务隔离级别是repeatable read ,一般情况下,没有特殊要求,
-- 没有必要修改(因为该级别可以满足绝大部分项目需求)
7. mysql 事务 ACID
7.1 事务的 acid 特性
1.原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2. 一致性(Consistency)
事务必须使数据库从一个致性状态变换到另外一个一致性状态
3.隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
4.持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,
接下来即使数据库发生故障也不应该对其有任何影响