当前位置: 首页 > 科技观察

一个简单的案例带你了解MySQL中的事务

时间:2023-03-12 16:32:45 科技观察

事务也叫TCL,全称是Transactioncontrollanguage,意为事务控制语言。本文仍属于我的mysql基础篇。上一节我们介绍了以下基础知识:数据库增改删操作数据表增改删操作数据增改删操作数据约束和增删改查Mysql内置函数删除这个文章还是基础系列文章,主要介绍Mysql中的事务。为了保持文章的完整性,即使没有看过前面的教程也没关系。一、认识事张三有1000元,李四也有1000元。张三给了李四500,还剩500,此时李四还有1500元。我们假设会执行如下mysql语句:updatetableusersetmoney=500wherename="张三";updatetableusersetmoney=1500wherename="李四";但它可能在计算机上有所不同。可能上面的语句执行了但是下面的没有执行,所以为了保证这两个语句要么执行要么不执行,这时候就使用了事务。一个事务就是一个或一组语句组成一个单元,这个单元要么全部执行,要么根本不执行。事务有四个特性,也是面试中经常考的ACID的四个特性:A(Atomicity):原子性是指一个事务是不可分割的,要么执行要么不执行。C(ConsistencyConsistency):事务必须使数据库从一种一致状态进入另一种一致状态。I(Isolation):指一个事务的执行不受其他事务的干扰。D(PersistenceDurability):持久性是指事务一旦提交,对数据库的改变是永久性的。2.创建交易。事务其实可以分为隐式事务和显式事务两类:隐式事务非常简单。比如我们的insert、delete、update、select语句都是隐式事务。显示的交易是指有明显开始和结束的标记。让我们创建一个显示的事务。第一步:禁用步进提交功能setautocommit=0;第二步:启动一个事务starttransaction;第三步:SQL语句updatetableusersetmoney=500wherename="张三";updatetableusersetmoney=1500wherename="李四";第四步:结束事务提交(submit)或回滚(rollback)。如果确定我们的语句没有问题,那么我们就可以commit,如果我们认为我们的语句有问题,那么rollback。这里新建一张表,然后插入两条数据。接下来,我们使用事务来更新:这里我们使用commit来提交。当然,如果我们突然发现我们之前的操作不对,我们可以使用回滚。3、上面的事务隔离级别在单个情况下一般不会出现什么问题,但是如果多个事务同时运行,就会出现问题。我们知道并发操作总是会出现各种各样的问题。对于事务,会出现以下三个典型问题:(1)脏读有两个事务T1和T2。如果T1读到一条数据,T2更新了,还没有提交,T2突然觉得回滚事务不合适,即不提交。此时T1读取的数据是无效数据。(2)不可重复读有两个事务T1和T2。如果T1读取了一条数据,然后T2更新了这条数据,T1再次读取发现值变了。(3)幻读有两个事务T1和T2。如果T1读取了一段数据,然后T2插入了一些新的数据,T1再次读取,又会出现一些数据。如何解决这些问题?既然多个事务同时运行不好,那就隔离一下。这时候就用到了事务的隔离。mysql默认的事务隔离级别是repeatable-read,而Oracle默认的是read-committed。演示事务的隔离级别也很简单。你只需要打开两个客户端演示就可以了。我不会在这里谈论它。