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(十四)事务的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程