MySQL事务控制语言

事务:

一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
案例:转账
小熊一号	1000
小熊二号	1000
update 表 set 小熊一号的余额=500 where name='小熊一号';	
意外
update 表 set 小熊二号的余额=1500 where name='小熊二号';	
如果出现意外那么上面的语句执行成功,下面语句执行失败
那么小熊一号的余额就剩余500,而小熊二号的余额还是1000
这个不是我们想看到的,事务就用在这种场合,要么全部失败,要么全部执行
如果发生错误,整个单元回滚

查看MySQL的存储引擎

SHOW ENGINES;

在MySQL中用的最多的存储引擎有:innodb myisam memory等 其中innodb支持事务,其他的不支持

事务的ACID属性

1:原子性
	原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
2:一致性
	事务必须使数据库从一个一致性状态变换成另外一个一致性状态
3:隔离性
	一个事务的执行不能被其他事务干扰,简单的说就是事务内部的操作及使用的数据对并发的事务是隔离的
	并发执行的各个事务之间不能互相干扰
4:持久性
	指一个事务一旦被提交,数据库中数据的改变是永久性的,
	接下来的其他操作和数据库故障不应该对其他有任何影响

2:事务的创建

隐式事务:事务没有明显的开启和结束的标记
	例:insert、update、delete语句
显示事务:事务具有明显的开启和结束标记	
	前提:必须先设置自动提交功能为禁用
查看autocommit自动提交变量
	SHOW VARIABLES LIKE 'autocommit';
设置自动提交功能为禁用
	SET autocommit=0;
步骤1:开启事务
	set autocommit=0;
步骤2:编写事务中的SQL语句(select insert、update、delete语句)	
	语句1;
	语句2;
	......
步骤3:结束事务
commit;提交事务
rollback;回滚事务

eg1:事务演示
创建一张账户表	
	CREATE TABLE account(
		id INT PRIMARY KEY AUTO_INCREMENT,
		uname VARCHAR(20),
		balance DOUBLE
	);
插入数据	
	INSERT INTO account(uname,balance)
	VALUES('小熊一号',1000),('小熊二号',1000);

(现在小熊一号要为小熊二号转账500)
开启事务
	SET autocommit=0;
编写一组事务语句
	UPDATE account SET balance = 500 WHERE uname = '小熊一号';
	UPDATE account SET balance = 1500 WHERE uname = '小熊二号';
结束事务
	COMMIT;
			(这边运行成功后,account表里面的数据就会修改成功)
查看表
	SELECT * FROM account;

(现在小熊一号要再次为小熊二号转账500,但是中间出现了意外,发生了异常,
事务需要回滚,否则小熊一号的余额为0元,而小熊二号的余额还是1500,转账失败)

开启事务
	SET autocommit=0;
编写一组事务语句
	UPDATE account SET balance = 0 WHERE uname = '小熊一号';
	UPDATE account SET balance = 2000 WHERE uname = '小熊二号';		
回滚事务
	ROLLBACK;
			(运行ROLLBACK后,account表里面的数据就会回到开启事务前的状态,这就是事务的回滚)				
查看表
	SELECT * FROM account;

3:数据库的隔离级别

如果事务访问数据库中相同的数据是,如果没有采取必要的隔离机制,就会出现各种并发问题:
3.1:脏读:
	这里有两个事务,T1,T2,T1读取了已经被T2更新但还没有被提交的的字段
	之后,如果T2回滚,那么T1读取的内容就是临时且无效的数据
	(就是说,错误读取,后续发现异常,选择回滚而不是提交)
3.2:不可重复读:
	这里有两个事务,T1,T2,T1读取了一个字段,然后T2更新了该字段,
	之后,T1再次读取同一个字段,值就不同了
	(就是说,T2给T1转账,T1第一次读取是转账1000,然后T2发现转账错了回滚,T2更新了转账变成500)
		然后T1再次读取是500)
3.3:幻读
	这里有两个事务,T1,T2,T1从表中读取了一个字段,然后T2在该表中插入了一些新的行,之后T1再次读取就会多出几行
	(就是说,T2往表中插入了数据,但是没有提交,
	T1读取了,
	后来T2发现需要再次插入数据,然后提交
	就会出现跟第一次读取不一样的结果)
	
以上出现的问题我们是需要避免的,那么事务与事务之间的隔离级别就出现了
数据库规定了多种不同的隔离级别, 而不同的隔离级别对应不同的干扰程度,
隔离级别越高,数据的一致性就越好,但是并发性就越弱

3.4:数据库提供的4重事务隔离级别

	
						脏读		幻读		不可重复读
	read uncommitted	√			√			√
	read committed		×			√			√
	repeatable read		×			×			√
	serializable		×			×			×
	
	mysql中默认第三个隔离级别  repeatable read
	查看mysql的隔离级别
	mysql5.5版本:select @@tx_isolation;
	mysql8.0版本:select @@transaction_isolation;
	设置隔离级别:
		set session|global transaction isolation level 隔离级别;

3.5:delete和truncate在事务使用时的区别
	1:delete
		SET autocommit = 0;
		DELETE FROM account;
		ROLLBACK;
	delete支持回滚
	2:truncate
		SET autocommit = 0;
		TRUNCATE FROM account;
		ROLLBACK;
	truncate不支持回滚
3.6:savepoint 节点名;  设置保存点
	SET autocommit = 0;
	DELETE FROM account WHERE id =1;
	SAVEPOINT a;#设置保存点
	DELETE FROM account WHERE id =2;
	ROLLBACK TO a;#回滚到保存点
	(此事务运行结束后,会回滚到a,那么就id为1的数据被删除,id为2的数据没有被删除)		

4:视图:

含义:虚拟表,和普通的表一样使用
	MySQL5.1版本出现的新特征,是通过表动态生成的数据
应用场景:
	多个地方用到同样的查询结果
	该查询结果使用的SQL语句比较复杂
优点:
	重用SQL语句
	简化复杂的SQL操作,不必知道它的查询细节
	保护数据,提供安全性
	
语法:
	create view 视图名
	as
	查询语句;
eg1:查询姓名中包含a字符的员工名,部门名和工种信息
	第一步:创建视图
		CREATE VIEW v1
		AS 
		SELECT last_name,department_name,job_title
		FROM employees AS e
		JOIN departments AS d
		ON e.department_id = d.department_id
		JOIN jobs AS j
		ON j.job_id = e.job_id;
	第二步:使用视图
		SELECT * FROM v1 WHERE last_name LIKE '%a%';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值