信宜做网站设置,购物商城网站建设公司,app一般用什么开发,化妆品公司网站建设方案MySQL 事务
事务用于保证数据的一致性#xff0c;它由一组相关的dml#xff08;数据操作语言 增删改#xff09;语句组成
该组的dml语句要么全部成功#xff0c;要么全部失败。
-- 1. 创建一张测试表
CREATE TABLE t27( id INT,name VARCHAR(32));-- 2. 开始事务
START …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会在表上加锁 防止其它用户改表的数据
事务的几个重要操作
start transaction --开始一个事务savepoint 保存点名–设置保存点rollback to 保存点名–回退事务rollback --回退全部事务commit – 提交事务,所有的操作生效,不能回退 回退事务
保存点(savepoint)是事务中的点用于取消部分事务
当结束事务时(commit)会自动的删除该事务所定义的所有保存点
当执行回退事务时通过指定保存点可以回退到指定的点 提交事务
使用commit语句可以提交事务当执行了commit语句子后
会确认事务的变化、结束事务、删除保存点、释放锁数据生效。
当使用commit语句结束事务后其它会话[其他连接]将可以查着到事务变化后的新数据[所有数据就正式生效] 注意
如果不开始事务默认情况下dml操作是自动提交的不能回滚如果开始一个事务你没有创建保存点你可以执行rollback默认就是回退到你事务开始的状态你可以在事务没有提交前选择回退到哪个保存点mysql的事务机制需要innodb的存储引擎才可以使用myisam不好使开始一个事务start transaction或者可以写 set autocommitoff
-- 1. 如果不开始事务默认情况下dml操作是自动提交的不能回滚
INSERT INTO t27 VALUES(300, milan); -- 自动提交 commitSELECT * 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 uncommittedSET 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 t29VALUES(1,tom), (2,jack), (3, hsp);
SELECT * FROM t29-- 指令修改存储引擎
ALTER TABLE t29 ENGINE INNODB修改存储引擎
ALTER TABLE 表名 ENGINE 储存引擎;