其他分享
首页 > 其他分享> > 事务

事务

作者:互联网

事务(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