MySQL的事务

1、MySQL事务的介绍

TCL:Transaction Control Language,事务控制语言
事务:在MySQL数据库中表示一条或多条SQL语句组合在一起的一个执行单元,这个执行单元要么全部执行,要么全部不执行,否则就会出现逻辑错误!
什么情况下会用到事务处理:
	例如A和B之间转账,A向B转账1000元,那么应该有两条SQL语句,第一步:A账户-1000元,第二部:B账户+1000元,如果没有事务处理的功能,则就可能发生这样的情况:A账户减掉了1000元,B账户也没有增加1000元
所以在类似的场景中我们需要用到事务处理:实现将第一步和第二部的SQL语句绑定在一起,要么都执行成功,要么不管是第一步执行出错或者第二部执行出错,那么数据库里的数据状态都要回滚到没有执行第一步和第二步SQL之前。
在讲事务之前,还要说一下MySQL数据库的存储引擎:InnoDB(存储引擎的一种)
1、什么事存储引擎:在MySQL中的数据是用各种不同的技术来存储在磁盘文件(或内存)当中的,这种具体的存储技术就是我们说的存储引擎
2、 我们可以通过show engines命令来查看MySQL支持的存储引擎
3、在MySQL支持的存储引擎中,InnoDB,myisam,memory这三个存储引擎是最常用的,但是其中只有InnoDB引擎支持事务处理,而其他是不支持事务处理的

2、事务的ACID

1、原子性(Atomicity):组成事务的SQL语句不可再分,要么都执行,要么都不执行。
2、一致性(Consistency):事务必须让数据的数据状态变化到另一个一致性的状态。比如:A和B之间转账,转账后,A和B的余额总和不变,前后具有一致性
3、隔离性(Isolation):一个事务的执行,不受其他事务的干扰,相互应该是隔离的,但是实际上是很难做到的,要通过隔离级别做选择!
4、持久性(Durability):一个事务被提交,并成功执行,那么它对数据的修改就是永久性的。接下来的其他操作或出现的故障,不能影响到它执行的结果

3、MySQL事务的创建

1、隐视事务:事务没有明显的开始和结束的标记。	这时候像insert语句,update语句和delete语句,每一条SQL语句就默认是一个事务
		显然,隐视事务在类似转账的逻辑业务需求的时候就无法处理了
2、显示事务:说白了,这个事务模式,就要我们在程序中手动的用命令开启事务和结束事务,并让事务里的多条SQL语句去执行
		注意:默认MySQL是开启自动提交事务的,用show variables like 'autocommit';命令可以查看到。
		所以开启显示事务前,要关掉它,用 set autocommit=0;只对本身会话有效
1、开始事务:
			set autocommit = 0;
			start transation;		--可选的,执行set autocommit=0已经默认开启了
2、编写事务中SQL语句(就是前面学到的增删改查语句)
			语句1;语句2;......
2、结束事务:
			commit;			--提交事务去真正执行
			rollback;			--回滚事务,回复数据库执行前的状态	
用法:
start transaction;				--开始事务
		#实现A账号转账500元到B账户
		update account set balance = 500 where username = 'A';
		update account set balance = 1500 where username = 'B'
commit;			--提交事务,SQL语句已经执行
rollback;			--回滚到开始事务之前,SQL语句没有执行
		

4、MySQL事务控制并发错误

当有多个事务同时访问数据库中的同一个数据时,如果没有采取必要的隔离机制,就会导致各种并发错误的发生;
比如有两个事务t1,t2:
1、脏读:当t2正在更新某个字段的数据进行更新,但还没有提交数据库执行时,t1在这个时候正好读取这个字段的数据,然后t2再执行下一个SQL时就会发生错误,然后数据库就会自动回滚数据,导致t1读取到的数据就是t2更新数据时的临时数据,这个数据是无效数据!
2、不可重复读:t1读取一个字段是数值,然后t2更新了这个字段,之后t1在读取同一个字段,值发生了变化!
3、幻读:t1读取一个字段是数值,然后t2对这个字段插入了新数值,t1在接着读取突然就多了几行数据

5、事务的隔离

数据库事务的隔离性:数据库必须具有隔离这种并发运行的事务的能力,避免这些错误现象!
一个事务与其他事务隔离的程度称为隔离级别:数据库规定了事务的隔离级别,不同隔离级别对应不同的干扰程度,级别越高,数据库一致性越好,但并发性越弱!
MySQL数据库支持四个不同的隔离级别,这四个由低到高的级别是:
			read uncommitted;读未提交的数据
			read commited;读已提交数据
			repeatable read;可重复读(默认)
			serialable;串行化
事务隔离的用法:
	1、net stop mysql, net start mysql			--重启mysql数据库,清除隔离级别
	2、mysql -u root -p密码			--登录进入MySQL数据库
	3、select @@tx_isolation			--查看当前隔离级别
	4、set session transaction isolation level read uncommitted			--设置为最低的隔离级别
	5、use test			--进入test数据库
	6、select * from account			--查看account表
	7、set autocommit=0			--开启事务
	8、update account set username = 'C' where id = 1;			--修改account表中的数据,但是没有提交事务,此时数据库实在内存中修改,没有真正被修改
	9、在开一个dos窗口,连上mysql,模拟另一个事务
				mysql -u root -p密码
				select @@tx_isolation
				set session transaction isolation level read uncommitted
				use test
				select * from account
				set autocommit=0			--开启一个新的事务
				select * from account 			--这是你查到的数据C,但是上一个事务的修改还没有提交	
	10、rollback			--结束事务,将原来的事务回滚

结论:
第一个级别:前面讲的三个错误都是会存在的
第二个级别:脏读错误没有了,但不可重复读和幻读仍然会有
第三个级别:脏读和不可重复读错误没有了,但幻读仍然会存在
第四个级别:可以解决所有的错误,但是会导致数据库的并发性非常弱,性能十分低下

6、事务设置回滚点

关键字:
用法:
	set autocommit = 0			--
	start transaction;			--开启事务
	#编写SQL语句
	delete from account where id = 1;
	savepoint a;			--设置保存点
	delete from account where id = 2;
	#结束事务
	commit;
	rollback to a;			--回滚到保存点
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值