博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3、mysql中的事务操作
阅读量:4035 次
发布时间:2019-05-24

本文共 2381 字,大约阅读时间需要 7 分钟。

事务又叫做TCL,全称是transaction control language,意思是事务控制语言。这篇文章还是属于我的mysql基础文章,在前面我们介绍了下面这些基础知识:

1、数据库的增查改删操作

2、数据表的增查改删操作

3、数据的增查改删操作

3、数据的约束以及增查改删

5、Mysql中的内置函数

这篇文章还是基础系列的文章,主要是介绍mysql中的事务,为了保持文章的完整性,就算你没有看过之前的教程也没问题。

一、事务的理解

张三有1000块钱,李四也有1000块钱,张三给李四500,还剩下500,李四此时就有1500。我们想象着会执行下面的mysql语句:

update table user set money=500 where name = “张三”;

update table user set money=1500 where name = “李四”;

但是在计算机中可能会不一样。可能上面语句执行了下面的没有执行,因此为了保证两条语句要么都执行,要么都不执行,这时候就用到了事务。

事务的意思是一条或者是一组语句组成一个单元,这个单元要么全部执行,要么全不执行。

事务具有四个特性,也是面试常考的四个特性ACID:

A(原子性Atomicity):原子性指的是事务是一个不可分割的,要么都执行要么都不执行。

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

I(隔离性Isolation):指的是一个事务的执行,不能被其他的事务所干扰。

D(持久性Durability):持久性指的是一个事务一旦提交了之后,对数据库的改变就是永久的。

二、创建一个事务

事务其实可以划分为两大类:隐式的事务和显示的事务

隐式的事务很简单,比如我们的insert、delete、update、select这些语句都是隐式的事务。

显示的事务指的是带有很明显的开始和结束的标记,下面就来创建一个显示的事务。

步骤一:禁用步骤提交功能

set autocommit = 0;

步骤二:开启一个事务

start transaction;

步骤三:sql语句

update table user set money=500 where name = “张三”;

update table user set money=1500 where name = “李四”;

步骤四:结束事务

commit(提交)或者是rollback(回滚)。如果确定我们的语句没有问题,那么我们就可以commit,如果认为我们的语句有问题,那就rollback。

mysql> create table account(    -> id int primary key auto_increment,    -> name varchar(20),    -> money double    -> );insert into account values(1,'张三',1000);insert into account values(2,'李四',1000);

在这里新建了一个表,然后插入了两条数据。下面我们使用事务,来更新一下:

mysql> set autocommit=0;mysql> update account set money=500 where name='张三';mysql> update account set money=1500 where name='李四';mysql> commit;Query OK, 0 rows affected (0.02 sec)mysql> select * from account;+----+--------+-------+| id | name   | money |+----+--------+-------+|  1 | 张三   |   500 ||  2 | 李四   |  1500 |+----+--------+-------+2 rows in set (0.00 sec)

在这里我们使用的是commit进行提交。当然如果突然发现我们之前的操作有错误,那就可以使用rollback。

三、事务的隔离级别

上面的事务在单个情况下一般不会出现什么问题,但是如果同时运行多个,就会出现问题了。我们知道并发操作总是会出现各种各样的问题,对于事务来说就会出现下面三个典型的问题:

(1)脏读

有俩事务T1,T2。如果T1读了一条数据,这条数据是T2更新的但是还没提交,突然T2觉得不合适进行事务回滚了,也就是不提交了。此时T1读的数据就是无效的数据。

(2)不可重复读

有俩事务T1,T2。如果T1读了一条数据,之后T2更新了这条数据,T1再次读取就发现值变了。

(3)幻读

有俩事务T1,T2。如果T1读了一条数据,之后T2插入了一些新的数据,T1再次读取就会多出现一些数据。

如何去解决这些问题呢?既然多个事务同时运行不好,那就把他们隔离开来。这时候就用到了事务的隔离性。

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted) 三种现象都可能出现
不可重复读(read-committed) 只允许读取已经提交的数据
可重复读(repeatable-read) 读取期间,其他事务不能更新
串行化(serializable) 读取期间,其他事务不能有增改删操作

mysql默认的事务隔离级别为repeatable-read,Oracle默认的是read-committed,

想要去演示事务的隔离级别也很简单,只需要开启两个客户端演示就OK了,在这里就不说了。

在这里插入图片描述

转载地址:http://ribdi.baihongyu.com/

你可能感兴趣的文章
[leetCode By Python] 14. Longest Common Prefix
查看>>
[leetCode By Python]111. Minimum Depth of Binary Tree
查看>>
[LeetCode By Python]118. Pascal's Triangle
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>
[LeetCode By Python]122. Best Time to Buy and Sell Stock II
查看>>
[LeetCode By Python]125. Valid Palindrome
查看>>
[LeetCode By Python]136. Single Number
查看>>
[LeetCode By MYSQL] Combine Two Tables
查看>>
如何打开ipynb文件
查看>>
[Leetcode BY python ]190. Reverse Bits
查看>>
Android下调用收发短信邮件等(转载)
查看>>
Android中电池信息(Battery information)的取得
查看>>
SVN客户端命令详解
查看>>
Android/Linux 内存监视
查看>>
Linux系统信息查看
查看>>
用find命令查找最近修改过的文件
查看>>
Android2.1消息应用(Messaging)源码学习笔记
查看>>
Phone双模修改涉及文件列表
查看>>
android UI小知识点
查看>>
Android之TelephonyManager类的方法详解
查看>>