Java基础专项复习7——事务

Java基础专项复习7——事务_第1张图片

Java基础专项复习系列目录

1、Java基础专项复习1——函数关键字static-CSDN博客

2、Java基础专项复习2——集合-CSDN博客

3、Java基础专项复习3——Map集合-CSDN博客

4、Java基础专项复习4——IO流-CSDN博客

5、Java基础专项复习5——异常-CSDN博客

6、Java基础专项复习6——多线程-CSDN博客


文章目录

目录

  • Java基础专项复习系列目录
  • 文章目录
  • 1.1事务的概述
  • 1.1.1转账的例子
  • 1.2在MySQL中操作事务
  • 1.2.1数据库的信息
  • 1.2.2在MySQL数据库中使用事务
  • 1.3在JDBC中操作事务
  • 1.3.1操作事务——Connection接口
  • 1.3.2Connection接口的2个作用
  • 1.4事务的特性
  • 1.4.1事务的特性:
  • 1.4.2不考虑事务的隔离性会引发的问题
  • 1.4.3设置事务的隔离级别(解决读的问题)
  • 1.4.4演示脏读
  • 1.4.5避免脏读和演示不可重复读
  •  1.4.6避免不可重复读
  • 1.4.7 避免各种读

1.1事务的概述

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

事务:组成各个数据的执行的单元,要么都成功,要么都不成功。事务能够保证数据的完整性

1.1.1转账的例子

转账的功能,冠希给美美转1000元钱。 
使用事务——先给冠希扣除掉1000元——再给美美加上1000元

1.2在MySQL中操作事务

1.2.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);
1.2.2在MySQL数据库中使用事务

提供两种方式( 模拟转账的例子,冠希给美美转钱):

  1. 第一种方式(使用命令的方式)
    start transaction; ‐‐ 开启事务
    update t_account set money = money ‐ 1000 where username = '冠希';
    update t_account set money = money + 1000 where username = '美美';
    commit; ‐‐ 提供事务(事务已经结束了,数据永久的保存到数据库中了)
    rollback; ‐‐ 回滚事务(事务已经结束了,数据回滚到最初始化的状态
  2. 第二种方式(设置MySQL事务不默认提交的方式)
    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;
    

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

update t_account set money = money ‐ 1000 where username = '冠希'; ‐‐ 这一条语句 默认使用了一个事务。

设置让MySQL的数据库的事务不默认提交

set autocommit = off或者0 ‐‐ 设置MySQL事务的事务不默认提交 

编写SQL语句(执行完,都没有提交)

sql1

sql2

需要手动的提交或者回顾

commit;

rollback;

1.3在JDBC中操作事务

1.3.1操作事务——Connection接口

Connection接口提供了如下方法

  • void setAutoCommit(boolean autoCommit) ‐‐ 如果传入了false,设置了MySQL数据 库的事务不默认提交的。
  • void commit() ‐‐ 提交事务
  • void rollback() ‐‐ 回滚事务
1.3.2Connection接口的2个作用
  1. 操作数据库,都需要使用Connection接口
  2. 管理事务

1.4事务的特性

1.4.1事务的特性:
  1. 原子性 ‐‐ 强调的是事务的不可分割的特性
  2. 一致性 ‐‐ 强调的是事务执行前后数据需要保证一致
  3. 隔离性 ‐‐ 强调的是多个事务同时操作一条记录,事务之间不能互相干扰
  4. 持久性 ‐‐ 强调的是事务一旦结束了,数据将永久的保存到数据库中

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

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

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

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

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

1.4.2不考虑事务的隔离性会引发的问题
  1. 脏读:一个事务读取到了另一个事务未提交的数据!
  2. 不可重复读:一个事务读取到了另一个事务提交的数据,导致了多次查询的结果不一致。强调的是update,修改记录的数据。
  3. 虚度(幻读):一个事务读取到了另一个事务提交的数据,导致了多次查询的结果不一致。强调是insert,向表中添加一条数据。
1.4.3设置事务的隔离级别(解决读的问题)

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

  • Read uncommitted ‐‐ 什么都解决不了
  • Read committed ‐‐ 避免脏读,但是不可重复读和虚读有可能产生
  • Repeatable read ‐‐ 避免脏读和不可重复读,虚读有可能产生的
  • Serializable ‐‐ 避免各种读

2.4种隔离级别有安全性和效率

安全

Serializable > Repeatable read > Read committed > Read uncommitted

效率

Serializable < Repeatable read < Read committed < Read uncomm

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

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

1.4.4演示脏读

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

进行测试

Java基础专项复习7——事务_第2张图片

1.4.5避免脏读和演示不可重复读

Java基础专项复习7——事务_第3张图片

 1.4.6避免不可重复读

Java基础专项复习7——事务_第4张图片

1.4.7 避免各种读

Java基础专项复习7——事务_第5张图片

你可能感兴趣的:(java,开发语言)