MySQL事务

本文详细解释了数据库事务的概念,包括其原子性、一致性、隔离性和持久性等特性,以及如何在MySQL中使用begin、commit和rollback命令进行事务处理。还讨论了自动提交策略和隐式提交的语句。
摘要由CSDN通过智能技术生成

1 .什么是事务

Transaction,一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)。一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成。事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。

数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成

以银行转账为例:账户转账是一个完整的业务,最小的单元,不可再分——也就是说银行账户转账是一个事务:

 update t_act set balance=balance - 400 where actno=1;
 update t_act set balance=balance + 400 where actno=2;

以上两台DML语句必须同时成功或者同时失败。最小单元不可再分,当第一条DML语句执行成功后,并不能将底层数据库中的第一个账户的数据修改,只是将操作记录了一下;这个记录是在内存中完成的;当第二条DML语句执行成功后,和底层数据库文件中的数据完成同步。若第二条DML语句执行失败,则清空所有的历史操作记录,要完成以上的功能必须借助事务。

事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。

事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;

要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。

为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。

2 .事务的特性

事务是由一组SQL语句 组成的逻辑处理单元,它的ACID特性如下:

原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

3 .MySQL使用事务

MySQL开启事务、回滚事务、提交事务命令。

 begin
 说明:在5.5 以上的版本,不需要手工begin,只要你执行的是一个DML,会自动在前面加一个begin命令。
 ​
 commit:提交事务
 完成一个事务,一旦事务提交成功 ,就说明具备ACID特性了。
 ​
 rollback :回滚事务
 将内存中,已执行过的操作,回滚回去

自动提交策略:

MySQL默认已经开启自动提交,我们可以通过对应的设置来开启或者关闭自动提交。

 db01 [(none)]>select @@autocommit;
 db01 [(none)]>set autocommit=0;
 db01 [(none)]>set global autocommit=0;
 ​
 注:
 自动提交是否打开,一般在有事务需求的MySQL中,将其关闭
 不管有没有事务需求,我们一般也都建议设置为0,可以很大程度上提高数据库性能
 ​
 (1)
 set autocommit=0;   
 set global autocommit=0;
 ​
 (2)
 vim /etc/my.cnf
 autocommit=0  

隐式提交语句:

 用于隐式提交的 SQL 语句:
 begin 
 a
 b
 begin
 SET AUTOCOMMIT = 1
 ​
 导致提交的非事务语句:
 DDL语句: (ALTER、CREATE 和 DROP)
 DCL语句: (GRANT、REVOKE 和 SET PASSWORD)
 锁定语句:(LOCK TABLES 和 UNLOCK TABLES)
 ​
 导致隐式提交的语句示例:
 TRUNCATE TABLE
 LOAD DATA INFILE
 SELECT FOR UPDATE

开始事务流程:

 1、检查autocommit是否为关闭状态
 select @@autocommit;
 或者:
 show variables like 'autocommit';
 ​
 2、开启事务,并结束事务
 begin
 delete from student where name='alexsb';
 update student set name='alexsb' where name='alex';
 rollback;
 ​
 begin
 delete from student where name='alexsb';
 update student set name='alexsb' where name='alex';
 commit;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值