mysql(十四)事务
2021/5/12 19:29:20
本文主要是介绍mysql(十四)事务,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、事务的操作与实现
ACID: 原子性:一个事务不可分割,同上同下 一致性:事务执行使数据从一个状态切换到另外一个状态 隔离性:一个事务的执行不受事务的干扰 持久性:一旦提交,无法撤销 事务的创建 隐式事务:没有明显的开启和结束标记(比如insert 、update、delete) 显示事务:有明显的开启和结束标记; 前提条件(必须设置自动提交功能为禁用) 步骤1:开启事务 SET autocommit=0;#关闭自动提交 【START TRANSACTION】;//可选的 步骤2:编写事务中的sql语句(增删改查 SELECT INSERT UPDATE....) 语句1 语句2 步骤3:结束事务 COMMIT;提交事务 ROLLBACK;回滚事务
# 查看变量 SHOW VARIABLES LIKE '%autocommit%';#查看自动提交 #一、事务的演示 #1.1创建表 DROP TABLE IF EXISTS account; CREATE TABLE account( id INT PRIMARY KEY auto_increment, username VARCHAR(20) CHARACTER SET utf8, balance DOUBLE ); #1.2插入数据 INSERT INTO account(username,balance) VALUES('张无忌',1000),('赵敏',1000); SELECT *FROM account; #1.3关闭自动提交 SET autocommit =0; START TRANSACTION; #1.4 添加事务语句 UPDATE account SET balance=500 WHERE username='张无忌'; SAVEPOINT a; UPDATE account SET balance=1500 WHERE username='赵敏'; #1.6 SAVEPOINT 设置保存点 ROLLBACK a; #1.5提交或者回滚 COMMIT; ROLLBACK;
2、隔离
/* 当不同事务同时访问数据库中相同的数据时,需要用到隔离 */ #改变隔离级别 == 线程加锁的位置 /* 四种隔离级别 脏读 不可重复读 幻读 READ UNCOMMITTED:读未提交的 × × × READ COMMITTED:读已提交的 √ × × REPEATABLE READ:可重复读(默认) √ √ × SERIALIZABLE:串行化(阻塞) √ √ √ eg:假如有两个事物T1、T2, 脏读:T1 读取(已被T2改变的数据,但是还未提交),这时T1读取的就是 错误的ls数据 不可重复读:T1读取了一个字段,然后T2更新之后(提交),T1再次读取同一个字段,就不同了 幻读:对于两个事物T1、T2;T1从一个表中读取一个字段,T2插入了新的行,T1在读取, 就会多出几行 */
事务一
#案列1:演示最低隔离级别 #需要两个事务操作 #查看隔离级别 SELECT @@tx_isolation; #设置事务隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted; #关闭主动提交 set autocommit=0; UPDATE students.account SET username='小小怪' WHERE id=1;#更改张无忌为小小怪 COMMIT; #案列2:read COMMITTED #查看隔离级别 SELECT @@tx_isolation; #设置事务隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL read committed; #关闭主动提交 set autocommit=0; #A、测试脏读 ok UPDATE students.account SET username='大大怪' WHERE id=1;#更改张无忌为小小怪 COMMIT; #B、测试不可重复读 set autocommit=0; UPDATE students.account SET username='王菲' WHERE id=1; COMMIT; #案列3:REPEATABLE READ #查看隔离级别 SELECT @@tx_isolation; #设置事务隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; #关闭主动提交 set autocommit=0; #A、测试脏读 ok UPDATE students.account SET username='王' WHERE id=1;#更改张无忌为小小怪 ROLLBACK; #B、测试不可重复读 set autocommit=0; UPDATE students.account SET username='王菲' WHERE id=1; COMMIT;
事务二
#案列1:演示最低隔离级别 USE students; #查看隔离级别 SELECT @@tx_isolation; #设置事务隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted; #关闭主动提交 set autocommit=0; SELECT *FROM account; #这个时候我还未提交结果,若我前一个事务回滚,这个数据就是错误的 COMMIT; /* 这个约等于未加锁(事务最低级别) 有个全局变量a=10 线程1: a=15; a=10;//这个相当于回退;不执行=提交 线程2: cout<<a; 得出结果为15, */ #案列2:read COMMITTED #查看隔离级别 SELECT @@tx_isolation; #设置事务隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL read committed; #关闭主动提交 set autocommit=0; #A、测试脏读 SELECT *FROM account; COMMIT; #B、测试不可重复 读 SELECT *FROM account;#查询第一次与 第二次不一样称为 不可重复读 SELECT *FROM account; COMMIT; #案列3:REPEATABLE READ #查看隔离级别 SELECT @@tx_isolation; #设置事务隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; #A、测试脏读 SELECT *FROM account; #B、测试不可重复 SELECT *FROM account; #对于同一事务 查询的结果是一样的
这篇关于mysql(十四)事务的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-29阿里 Canal 实时同步 MySQL 增量数据至 ClickHouse 数据库
- 2024-05-24在Linux下管理MySQL的大小写敏感性
- 2024-04-26MySQL查出时间比实际晚8小时的解决方案
- 2024-04-01JPA不识别MySQL的枚举类型
- 2024-03-30mysql数据库表卡死解决方法
- 2024-03-15MySQL多数据源笔记5-ShardingJDBC实战
- 2024-03-11natural join mysql
- 2024-03-11关于VS2017,VS2015 中利用 EF使用Mysql 不显示数据源问题解决方案
- 2024-02-26mysql 阿里云xb后缀备份文件恢复-icode9专业技术文章分享
- 2024-02-22docker mysql 5.7