第九章《事务》

第九章《事务》

事务
多条sql语句的集合,要么都成功,要么都失败,事务基于存储引擎提供(innodb)
事务的特性ACID
A 原子性(atomicity):事务必须被视为一个不可分割的单元。
C 一致性(consistency):数据库从一种状态切换到另一种状态。
I 隔离性(isolation):事务在提交之前,对其他事务不可见。
D 持久性(durablity):一旦事务提交,所修改的数据永久保存到数据库。
在这里插入图片描述
在这里插入图片描述

开启事务
Start transaction
Begin
在这里插入图片描述
在这里插入图片描述
回滚事务
Rollback
在这里插入图片描述
提交事务
Commit
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述查看自动提交状态
Show variables like ‘autocommit’
开启第二次事务时,上一个事务将会被隐式提交
Set autocommit=0 关闭自动提交 =1 开启自动提交

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看自动提交状态
Show variables like ‘autocommit’
开启第二次事务时,上一个事务将会被隐式提交
Set autocommit=0 关闭自动提交 =1 开启自动提交
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
事务的四种隔离级别
1.read uncommitted(未提交读)
2.read committed(已提交读)
3.repeatable read (可重复读)
4.serializable(可串行读)

设置隔离级别的命令 : SET SESSION TX_ISOLATION=‘READ-UNCOMMITTED/READ-COMMITTED/REPEATABLE READ/SERIALIZABLE’

1.未提交读:
多个事务同时进行,一个事务在未提交时执行操作,对于其他事务是可见的,未提交读会产生脏读的问题,
在这里插入图片描述
在这里插入图片描述
另开终端进入mysql 别名b事务表
在这里插入图片描述
第九章《事务》
A事务
在这里插入图片描述
B
第九章《事务》
A
在这里插入图片描述
事务B修改了数据,但还未提交,这时候事务A就读到被事务B修改的数据,事务B进行回滚,然后事务A再次读到的数据和刚刚的不一致,事务A读到的事务B未提交的哪行数据就是脏读;
2. 已提交读:
多数数据库都将已提交读设置为默认隔离级别(mysql不是),一个事务对数据表进行的操作,
提交以后才对其他事务可见。它解决了脏读的问题。但是它会产生不可重复读的问题;

事务A:
mysql> SET SESSION TX_ISOLATION=‘READ-COMMITTED’;
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM student1;
±—±———+
| id | name |
±—±———+
| 2 | zhangsan |
| 3 | zhangsi |
| 4 | zhangwu |
| 5 | zhangliu |
±—±———+
4 rows in set (0.00 sec)

事务B:
mysql> SET SESSION TX_ISOLATION=‘READ-COMMITTED’;
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE student1 SET name=‘zhangqi’ WHERE id=5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

事务A:查看
mysql> SELECT * FROM student1;
±—±———+
| id | name |
±—±———+
| 2 | zhangsan |
| 3 | zhangsi |
| 4 | zhangwu |
| 5 | zhangliu |
±—±———+
4 rows in set (0.00 sec)
事务B没有提交的修改,我们在事务A当中看不到;

事务B:提交事务
mysql> COMMIT;
Query OK, 0 rows affected (0.01 sec)

查看事务A:
mysql> SELECT * FROM student1;
±—±———+
| id | name |
±—±———+
| 2 | zhangsan |
| 3 | zhangsi |
| 4 | zhangwu |
| 5 | zhangqi |
±—±———+
4 rows in set (0.00 sec)
事务B提交了以后,事务A对提交结果可见,这样解决了未提交读的脏读问题,但是在事务
A当中查看到的事务B提交前后的内容发生变化,两次读的数据不一致了,这个问题叫做不可
重复读(也就事务A无法再读到事务B提交前的数据了)。

3.REPEATABLE(可重复度)
可重复读 终端1插入数据提交后,终端2提交后,才能看到插入后的数据
不存在脏读
幻读存在
不可重复读得到解决
AB
在这里插入图片描述
A
在这里插入图片描述
B查看
在这里插入图片描述
A
在这里插入图片描述
B
在这里插入图片描述
在这里插入图片描述
4. SERIALIZABLE(可串行读):
事务的最高隔离级别,它可以解决脏读、不可重复读、幻读的问题;但是设置这种隔离级别,
mysql处理事务的性能会下降,它一般很少用,只用于对数据一致性要求特别高的事务当中;
事务A:
mysql> SET SESSION TX_ISOLATION=‘SERIALIZABLE’;
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM student2 WHERE id<7;
±—±————+
| id | name |
±—±————+
| 1 | zhaosi |
| 2 | zhaowu |
| 3 | zhaoliu |
| 6 | zhaoxiaosan |
±—±————+
4 rows in set (0.00 sec)

事务B:
mysql> SET SESSION TX_ISOLATION=‘SERIALIZABLE’;
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO student2 VALUES(5,‘zhaolaoer’);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
//插入的id=5的数据,执行insert命令被阻塞了,过了超时时间之后返回错误信息;
原因是事务A对student的数据正在进行查询,student2表的相应字段被锁定,所以无法插入;
事务A提交了以后,事务B就可以正常插入数据了。

在这里插入图片描述

读锁(共享锁,s锁)
如果事务a对于表s加了读锁,其他事务可以继续对s 加读锁,但是不能加写锁,保证数据可以被读取,但是不能写入
写锁(排他锁,x锁)
如果事务a 对于表s 加了写入锁,其他事务不能对s加任何锁,除非a释放了对于s的加锁,保证其他事务对于s既不能读也不能写

事务保存点(仅对事务有效)
Savepoint 名字 对事务进行存档
读取保存点
Rollback to 保存点名字 回滚到指定位置的保存点
保存点只能存在于事务中,如果离开事务,保存点设置不成功,且保存点只能向前进行回滚,一旦回滚到之前的保存点,在其之后的保存点将会失效。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101969.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • salesforce的功能_salesforce开发

    salesforce的功能_salesforce开发时刻分享,时刻感恩!124、【CustomURLButtonforCommunity】:CreatingCustomButtonCodeforPartnerCommunities&SalesforceInternal场景:需要在Community中应用URL自定义Button,并且URL不受环境影响-避免HardCode。方案1Sample:{!URL……

    2022年10月20日
    0
  • java对象转换map

    java对象转换map背景介绍原理说明反射概念功能作用实现方式方法介绍实例展示对象转MAP背景介绍  今天在项目研发的过程中遇到这样一个需求,在一个统一处理类的入口要将所有后面处理流程需要用到的值统一塞进上下文的MAP对象中,这其中就包括了一持久层的DO对象。  如果对于对象进行逐个遍历是可以实现这个需求,但代码量比较大,所以一直在寻求一种比较合理的处理方式。后来发现可以通过反射的方式实现这个功能。原理

    2022年6月11日
    40
  • 40个容易上瘾的HTML5网页游戏,总有一款适合你[通俗易懂]

    40个容易上瘾的HTML5网页游戏,总有一款适合你[通俗易懂]我记得姐姐家的孩子在刚刚才学会走路,说话还不能完整的时候就已经能自己用小手点出小游戏的网站来一个人自娱自乐。我一直在想这一代跟着计算机一起茁壮成长的孩子会不会也和美国那一代人一样,出现9岁的黑客和计算机天才。但是并不是信息的成长就能让教育同步。很多时候我们会发现教育在发展的大环境中并没有什么创新的思考。不管怎么说,我们还是需要小盆友们能有足够的想象力。不要被束缚!今天分享的是40个HTML5的网页

    2022年5月24日
    29
  • c language program_language deficit

    c language program_language deficitprintf(“%d\n”,a) scanf(“%d%d”,&num1,&num2),&代表存放的是地址,scanf相当于scannerin 在同一个工程项目中,全局变量可通用,如果要A类要用的B类的全局变量num,则这样声明,externintnum,然后就可以使用了………………………………………………………………………………………….

    2022年9月28日
    1
  • spring和springboot常用注解_Java常用注解

    spring和springboot常用注解_Java常用注解一、Spring常用注解Spring常用注解(绝对经典)二、Jpa1、@Entity,@Table(name=””)表明这是一个实体类,一般用于jpa,这两个注解一块使用,但是如果表名和实体类名相同的话,@Table可以省略。2、@MappedSuperClass基于代码复用和模型分离的思想,在项目开发中使用jpa的@MappedSuperClass注解,将实体类的多个属性分别封装到不同的非实体类中。例如,数据库表中都需要id来表示编号,id是这些映射实体类的通用属性,交给jpa统

    2022年8月20日
    7
  • sql server2008 r2 密钥

    sql server2008 r2 密钥sqlserver2008r2密钥Developer:PTTFM-X467G-P7RH2-3Q6CG-4DMYBEnterprise:JD8Y6-HQG69-P9H84-XDTPG-34MB

    2022年7月4日
    22

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号