ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

事务

2021-10-20 15:02:08  阅读:232  来源: 互联网

标签:事务 隔离 +----+----------+ user 提交 级别


事务(Transaction)
	一个事务是一个完整的业务逻辑单元,不可再分
	如:银行账户转账,从A账户向B账户转账10000,需要执行两条update语句:
		update t_act set balance=balance-10000 where actno='act_001';
		update t_act set balance=balance+10000 where actno='act_002';
	以上两条DML语句必须同时成功,或者同时失败,不允许出现一条成功,一条失败
	要想保证以上两条DML语句同时成功或同时失败,就需要使用数据库的‘事务机制’
	
	和事务相关的语句只有:DML语句(insert delete update)
	why?
		因为它们三个语句都是和数据库表当中的‘数据’相关的,事务的存在是为了保证数据的完整性、安全性
	事务特性:(ACID)
		A:原子性	事务是最小的工作单元,不可再分
		B:一致性	事务必须保证多余的DML语句同时成功或同时失败
		C:隔离性	事务A与事务B之间具有隔离
		D:持久性	说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束
	事务间的隔离性:
		事务隔离性存在隔离级别,理论上隔离级别包括4个:
			第一级别:读未提交(read uncommitted) 
					//对方事务还没有提交,我们当前事务可以读取到对方未提交的数据
					  读未提交存在脏读(Dirty read)现象:表示读到了脏的数据
			第二级别:读已提交(read committed)
					//对方事务提交后的数据我方可以读取到
					  这种隔离级别解决了脏读现象
					  读已提交存在的问题是:不可重复读
			第三级别:可重复读(repeatable read)
					//这种隔离级别解决了不可重复读问题
					  这种隔离级别存在的问题是:读取到的数据是幻象
			第四级别:序列化读/串行化读(serializable)
					//解决了所有问题
					  效率低,需要事务排队
			MySQL数据库默认的隔离级别是:可重复读
	
	演示事务
		*MySQL事务默认情况下是自动提交的(只要执行任意一条DML语句则提交一次)
			关闭自动提交:start transaction;
	案例:
		准备表:
			drop table if exists t_user;
			create table t_user(
				id int primary key auto_increment,
				username varchar(255)
			);
		演示:
			1.MySQL中的事务是自动提交的,只要执行一条DML语句则提交一次
				insert into t_user(username) values('zs');
				select *from t_user;
				+----+----------+
				| id | username |
				+----+----------+
				|  1 | zs       |
				+----+----------+
				rollback;
				select *from t_user;
				+----+----------+
				| id | username |
				+----+----------+
				|  1 | zs       |
				+----+----------+
			2.使用start transaction关闭自动提交
				start transaction;
				insert into t_user(username) values('lisi');
				select *from t_user;
				+----+----------+
				| id | username |
				+----+----------+
				|  1 | zs       |
				|  2 | lisi     |
				insert into t_user(username) values('wangwu');
				rollback;
				select *from t_user;
				+----+----------+
				| id | username |
				+----+----------+
				|  1 | zs       |
				+----+----------+
		使用两个事务演示隔离级别:
			1.演示read uncommitted
				设置事务的隔离级别:
					mysql> set global transaction isolation level read uncommitted;
					查看事务的全局隔离级别: select @@global.tx_isolation;
			2.演示read committed
			3.演示repeatable read
			4.演示串行化读(serializable)
				

  

标签:事务,隔离,+----+----------+,user,提交,级别
来源: https://www.cnblogs.com/-slz-2/p/15428837.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有