当前位置: 首页 > news >正文

事务的相关介绍

一、事务的概述

1.概述:了解什么是事务

        事务是数据库提供的一个特性。

        事务:组成各个数据的执行的单元,要么都成功,要么都不成功。

2.转账的例子

        转账的功能,冠希给美美转1000元钱。

  • 使用事务

    • 先给冠希扣除掉1000元

    • 再给美美加上1000元

  • 事务结束了

二、在MySQL中操作事务

1.数据库的信息

create table t_account(id int primary key auto_increment,username varchar(20),money double
);
insert into t_account values (null,'美美',10000);
insert into t_account values (null,'冠希',10000);
insert into t_account values (null,'小凤',10000);
insert into t_account values (null,'熊大',10000);
insert into t_account values (null,'熊二',10000);

2.在MySQL数据库中使用事务

        模拟转账的例子,冠希给美美转钱

        第一种方式(使用命令的方式)

start transaction; ‐‐ 开启事务
update t_account set money = money ‐ 1000 where username = '冠希';
update t_account set money = money + 1000 where username = '美美';
commit; ‐‐ 提供事务(事务已经结束了,数据永久的保存到数据库中了)
rollback; ‐‐ 回滚事务(事务已经结束了,数据回滚到最初始化的状态)

        第二种方式(设置MySQL事务不默认提交的方式)

        MySQL数据库的事务是默认提交的。

update t_account set money = money ‐ 1000 where username = '冠希'; ‐‐ 这一条语句默认使用了一个事务。
‐‐ 设置让MySQL的数据库的事务不默认提交
set autocommit = off或者0 ‐‐ 设置MySQL事务的事务不默认提交
‐‐ 编写SQL语句(执行完,都没有提交)
sql1
sql2
‐‐ 需要手动的提交或者回顾
commit;
rollback;

        演示第二种方式

show variables like '%commit%'; ‐‐ 查看事务的是事务是否是默认提交
set autocommit = off; ‐‐ 设置不默认提交
update t_account set money = money ‐ 1000 where username = '冠希';
update t_account set money = money + 1000 where username = '美美';
commit; -- 或者rollback;

三、在JDBC中操作事务

1.操作事务

        需要掌握的是Connection接口,提供了方法

void setAutoCommit(boolean autoCommit) ‐‐ 如果传入了false,设置了MySQL数据库的事务不默认提交的。
void commit() ‐‐ 提交事务
void rollback() ‐‐ 回滚事务

2.Connection接口的2个作用

  • 操作数据库,都需要使用Connection接口

  • 管理事务

四、事务的特性

1.事务的特性

        原子性:原子性对应的英文是Atomicity,即表示事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。

        一致性:一致性对应的英文是Consistency,事务执行后,数据库状态与其它业务规则保持一致。例如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。

        隔离性:隔离性对应的英文是Isolation,是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。

        持久性:持久性对应的英文是Durability,指的是一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

  • 原子性 ‐‐ 强调的是事务的不可分割的特性

  • 一致性 ‐‐ 强调的是事务执行前后数据需要保证一致

  • 隔离性 ‐‐ 强调的是多个事务同时操作一条记录,事务之间不能互相干扰

  • 持久性 ‐‐ 强调的是事务一旦结束了,数据将永久的保存到数据库中

        这些特性都是数据库提供的

2.不考虑事务的隔离性会引发的问题

(1)脏读:一个事务读取到了另一个事务未提交的数据

(2)不可重复读:一个事务读取到了另一个事务提交的数据,导致了多次查询的结果不一致。强调的是update,修改记录的数据.

(3)虚读(幻读):一个事务读取到了另一个事务提交的数据,导致了多次查询的结果不一致。强调是insert,向表中添加一条数据。

3.设置事务的隔离级别

(1)事务的隔离级别(设置数据库的隔离级别,根据级别的不同,解决上述的读的问题)

  • Read uncommitted ‐‐ 什么都解决不了

  • Read committed ‐‐ 避免脏读,但是不可重复读和虚读有可能产生

  • Repeatable read ‐‐ 避免脏读和不可重复读,虚度有可能产生的

  • Serializable ‐‐ 避免各种读

(2)4种隔离级别有安全性和效率

  • 安全 Serializable > Repeatable read > Read committed > Read uncommitted

  • 效率 Serializable < Repeatable read < Read committed < Read uncommitted

(3)数据库都有自己默认的隔离级别

        MySQL的数据库,默认的隔离级别是Repeatable read,避免脏读和不可重复读。

五、演示脏读

1.脏读:一个事务读取到了另一个事物未提交的数据.

2.进行测试

  • 开启两个窗口,一个A窗口(左),一个B窗口(右)。

  • 在A窗口中,查询A窗口的隔离级别:select @@tx_isolation;

  • 设置A窗口的隔离级别为最低级别:set session transaction isolation level read uncommitted;

  • 在两个窗口中,都开启事物

  • start transaction;

  • B窗口中完成转账的工作。(冠希给美美转1千钱)

    • update t_account set money = money ‐ 1000 where username = '冠希';

    • update t_account set money = money + 1000 where username = '美美';

    • 注意:B窗口的事物未提交。

  • A窗口中,查询的结果(美美)

    • ​​​​​​​select * from t_account;

  • B窗口中,回滚的是事物

    • ​​​​​​​rollback;

六、避免脏读和演示不可重复读

1.避免脏读的发生,提高的隔离级别。

  • set session transaction isolation level read committed;

  • 在两个窗口中,都开启事物

    • ​​​​​​​start transaction;

  • B窗口中完成转账的工作。(冠希给美美转1千钱)

    • update t_account set money = money ‐ 1000 where username = '冠希';

    • update t_account set money = money + 1000 where username = '美美';

    • 注意:事物还是没有提交,但是你需要观察A窗口中是否能读取到B创建未提交的数据。

  • A窗口中,查询的结果(美美)

    • select * from t_account;

  • B窗口中把事物提交了

    • commit;

  • A窗口中,再查询一次钱。

    • 两次查询的结果不一致,发生了不可重复读。

七、避免不可重复读

1.设置隔离级别:set session transaction isolation level repeatable read;

  • 在两个窗口中,都开启事物

    • start transaction;

  • B窗口中完成转账的工作。(冠希给美美转1千钱)

    • update t_account set money = money ‐ 1000 where username = '冠希';

    • update t_account set money = money + 1000 where username = '美美';

    • 注意:事物还是没有提交,但是你需要观察A窗口中是否能读取到B创建未提交的数据。

  • A窗口中,查询的结果(美美)

    • select * from t_account;

  • B窗口中把事物提交了

    • commit;

  • A窗口中,再查询一次钱。

    • 两次查询的结果不一致,发生了不可重复读。

八、避免各种读

1.设置隔离级别:set session transaction isolation level serializable;

  • 在两个窗口中,都开启事物

    • start transaction;

  • 在B窗口中添加一条数据

    • insert into t_account values (null,'小苍',10000);

    • 注意:没有提交事物

  • 在A窗口中查询数据库

    • ​​​​​​​​​​​​​​select * from t_account;

http://www.dtcms.com/a/586409.html

相关文章:

  • 安徽省工程建设信息网站投资公司设立条件
  • Spring 框架核心技术全解析
  • C# OpenCVSharp使用 读光-票证检测矫正模型
  • 更换空间对网站的影响开发app需要什么设备
  • 佛山网站制作公司沈阳网页设计招聘
  • 南宁比优建站wordpress管理工具栏
  • 企业如何建设自己的网站网站主页跳转index
  • 网站利用百度离线地图淘宝电脑版网页
  • 工业控制网关物联网解决方案软硬件定制:我是你的研发部
  • 第2章 传感器技术与数据处理
  • 【开题答辩全过程】以 房地产销售管理系统为例,包含答辩的问题和答案
  • 建设项目环评验收网站建设行业门户网站需要什么条件
  • maven常用的命令
  • 动态商务网站开发与管理合肥网站建设工作室
  • 设计的网站都有哪些内容新榜数据平台
  • 扶绥县住房和城乡建设局网站品牌网站建设精湛磐石网络
  • MCU 的SPI 关键部分配置注意事项(SPI多机通信时)
  • 付网站建设费如果做账wordpress修改版面
  • 网站建设的实训心得 500字新城建站
  • Linux网络-Socket 编程 UDP
  • Rust编程进阶 - 如何基于生成器设计一套协程(Coroutine)的方案, 从而方便编写大规模高性能异步程序
  • LangChain 中 ChatPromptTemplate 的几种使用方式
  • 怎么创建企业网站同源大厦 网站建设
  • 3网合一网站天眼企业查询系统官网
  • 网站建设人工智能开发怎样建个人网页免费
  • 1.2.3AOP的底层原理
  • Android 屏幕旋转流程
  • 简述电子商务网站的建站流程佛山app开发公司
  • 精准突破 0.5mm 透明玻璃测量瓶颈 —— 泓川科技激光位移传感器的技术革新与成本优势
  • C++笔记-24-文件读写操作