java复习 事务

数据库怎么存放数据 : 先把数据放到表里 再把表放到数据库里
一个数据库可以有多个表 表名字不能相同
表有一些特征,这些特性定义了数据库在表中如何存储
表由列组成,我也成为字段所有表都是由一列或者多列组成的
表中的数据是按行存储的

什么是事务(Translation)

事务是一些操作的集合;他就是一个程序的执行单元;
事务本身是不包含这四个特征的需要一些手段让执行单元满足这四个特征
数据库的事务是指一组sql语句组成的数据库逻辑处理单元,在这组的sql操作中,要么全部执行成功,要么全部执行失败
事务是一个不可分割的数据库操作序列,也就是数据库控制并发控制的基本单位;
组成: 一个数据库事务通常包含对数据库进行读和写的一个操作序列

begin   tran *开始事务*
declare @error int ——声明变量,用来存储sql语句的执行错误
          *SQL语句1*
          
end *结束事务*

事务的四大特征 ACID

1 原子性:事务是最小的执行单位,不允许分割,其中包含的操作要么全部成功要么全部失败 满足原子操作单元
2 一致性:事务的执行前后,数据要保持在一种合法的情况,事务前后的数据完整性要保证一致 事务的开始和完成,数据都必须保持一致性。
3 持久性:一个事务一旦提交,对于数据库的修改是永久的,即时数据库发发生了故障也不能有任何影响 事务一旦提交就不可逆
4 隔离性:多个事务并发执行时候,事务的内部操作和其他事务的内部操作时相互隔离的,互不影响的

mysql是默认开启事务的

-- mysql是默认开启事务的
SET autocommit = 0;/*关闭事务*/
SET autocommit = 1;/*开启事务*/


-- 手动处理事务
SET autocommit = 0;-- 关闭自动提交
-- 事务开启
START TRANSACTION -- 标记一个事务的开始,从这个之后 sql 都在同一事务里
INSERT xx
INSERT xx

-- 提交: 持久化 (执行成功)
COMMIT
-- 回滚: 回到原来的样子(执行失败)
ROLLBACK
-- 事务结束


SET autocommit = 1;-- 开启自动提交
SAVEPOINT 保存点名 --  设置一个事务的保存点
ROLLBACK TO SAVEPOINT -- 回滚到保存点
RELEASE SAVEPOINT -- 删除保存点

事务的

-- 转账
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop
CREATE TABLE 'account' (
'id' INT(3) NOT NULL AUTO_INCREMENT,
'name' VARCHAR(30) NOT NULL,
'money' DECIMAL(9,2) NOT NULL,
PRIMARY KEY('id')
)ENGINE = INNODB DEFAULT CHARSET= utf8

INSERT INTO 'account' ('name','money') 
VALUES('A',2000.00),('B',10000.00)
SET autocommit = 0;
START TRANSACTION -- 开启一个事物
UPDATE 'account' SET money = money - 500 WHERE 'name' = 'A'
UPDATE 'account' SET money = money + 500 WHERE 'name' = 'B'
COMMIT-- 提交: 持久化 (执行成功)
ROLLBACK-- 回滚: 回到原来的样子(执行失败)

事务的隔离级别

并发情况下事务引发的问题

一般情况下,多个单元操作并发进行,会出现这么几个问题
1 脏读 : 两个事务 A事务还未提交 B事务就读到了A事务的结果 (破坏了隔离性一个事务读取了另外一个事务没有提交的数据
2 不可重复读:A事务在本次事务中,对自己未操作过的数据进行了反复读取,结果却出现了不一致或者记录不存在的情况(破坏了一致性 , update 和 delete在一个事务内读取表中的某一行数据,多次读取结果不对
3 幻读:A事务在本次事务中,对自己未操作过的数据进行了反复读取 第一次读取的时候,记录不存在,第二次读取的时候,记录出现了(破坏了一致性 insert指一个事务内读取到了别的事务插入的数据,导致前后读取不一致

解决这些问题(其实就是提供了一些标准)

为了权衡隔离并发的矛盾 ISO定义了四个事务的隔离级别,每个级别的隔离程度不同,允许出现的副作用也不同

  1. 读取未提交(read uncommitted) 最低一级别 只能保证持久性 允许读取未提交的数据
  2. 读取已提交(read committed): 语句级别的 允许事务读取已提交的数据 ,相当于写加锁
  3. 可重复读(repeatable read):事务级别的 保证一个事务不会修改已经由另一个事务读取的数据,相当于读加锁和写加锁
    mysql的默认事务隔离级别是可重复读
  4. 串行化 : 最高级别 事务与事务完全串行执行,毫无并发可言,性能极低
    在这里插入图片描述
    注意:这四个级别只是一个标准,并不是完全按照这个标准来做

实现这个标准

InnoDB

1 锁机制:通过加锁来阻止其他事务对数据进行的操作:各个隔离级别主要体现在读取数据是加的锁和释放锁的时机
RU:事务读取的时候,不加锁
RC:事务读取的时候加行级锁(读到才加锁),一旦读完,立刻释放锁(并不是事务结束)
RR:事务读取的时候加 行级共享锁,直到事务结束才释放
SE:事务读取的时候加表级共享锁,直到事务结束时候,才释放

2 MVCC机制:(多版本并发控制技术 ) 为了提高多线程并发控制时候的读写效率 生成一个数据快照
实际上就是

**

MVCC

**
MVCC是用来干嘛的: (多版本并发控制技术 ) 为了提高多线程并发控制时候的读写效率

当前读: 读取的总是数据库的最新版本,最新的数据
快照读:读取的历史版本的记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值