第一天学习MySql(5)-数据库的事务和其他数据类型

5.1数据库的事务

5.1.1 什么是事务?

事务,可以简单描述为要么成功,要么失败的一组相互依赖的操作,是并发控制的基本单位。
如以下语句:

update from account set money=money-100 where name=‘joj’;
update from account set money=money+100 where name=‘bob’;

我们期待的结果是,joj转账之后的钱会到bob中,但是如果joj的钱扣了100后,出现了异常导致bob没有增加100,那么我们所希望的结果也会异常。
++其中事务就起作用了,它由一组在业务逻辑上相互依赖的SQL语句组成。++
当第二条语句不能正常执行的时候,撤销事务,将不会造成异常结果。

5.1.2 事务的生命周期

简单点来说,当我们commit(提交事务)之后,数据库将表不能回滚。

5.1.3 开启事务命令

select @@autocommit;查看是否自动提交事务
start transaction 开启事务
rollback 回滚事务
commit 提交事务

start transaction
….
….
commit or rollback

savepoint 保存点
rollback to 取消某点之后的事务
rollback 撤销所有事务

start transaction;
update from account set money=money-100 where name=‘joj’;
update from account set money=money+100 where name=‘bob’;
savepoint sp; update accounts set money=money-100 where name='lucy';
rollback to sp;

5.1.4 事务的特性(ACID)

5.1.4.1 原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,要么sql语句全部执行成功,要么全部执行失败。

5.1.4.2 一致性(Consistency)

事务必须使数据库从一个一致性状态变换到另外一个一致性状态。例如银行转账过程中,无论怎么转,两个人之间的总额度是不变的。如果不满足,两个人都同时增加了3000,则不满足一致性。

5.1.4.3 持久性(Durability)

事务提交之后,对数据库改变是永久性的,发生故障也不会改变。

5.1.4.4 隔离性(Isolation)

多个用户迸发访问数据库,多个迸发事务相互隔离,不会被其他事务干扰。
例如:当bob在银行中转账后,先执行的是
update from account set money=money+100 where name=‘joj’;
然后joj查询,看到自己新增了100块,
之后出现异常,事务回滚,joj再看自己的总额度,发现又少了100.

5.1.5 事务的可能出现的迸发问题

5.1.5.1 脏读

一个事务读到另一事务未提交的更新数据。
也就是我们上面5.1.4.4 隔离性(Isolation)提到的,joj看到了bob未提交的数据。

5.1.5.2 不可重复读

一个事务读到另一个事务已提交的更新数据。
与脏读的区别是:脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已提交的数据。
在当前用户的本次事务中不想再看到已提交的更新数据的任何变动的时候,我们拒绝出现不可重复读的问题。

5.1.5.3 虚读(幻读)

一个事务读到另一事务已提交的新插入的数据。
与不可重复读相同,区别在于这个是已提交的数据。

5.1.5.4 第一类丢失更新

撤销一个事务时,把其他事务已提交的更新数据覆盖。
例如:当bob在银行中转账后,先执行的是
update from account set money=money+100 where name=‘joj’;
coc同时也给joj转账,并且事务提交成功。
然后joj查询,看到自己新增了200块,
之后出现异常,事务回滚,joj再看自己的总额度,发现又少了200,其中100回到了bob的账户中,剩下一百却丢失了。

5.1.5.5 第二类丢失更新

一个事务覆盖另一事务已提交的更新数据。
两个事务同时对同一行进行操作,同时提交后,有一个事务做出的改变会丢失。

5.1.6 隔离级别

如下图
这里写图片描述
这里写图片描述
MySql默认隔离级别:Repeatable Read
没有哪种隔离级别最好的说法,应该根据使用场景来决定使用级别。
如上述5.1.4.4 隔离性(Isolation)中,我们可以使用Read Committed以上更高的隔离级别。
又如我们后台查看账单时,如果查看到的数据一直改变,并不是我们希望看到的结。使用Repeatable Read以上的更高级别,我们可以在该次事务内查看的数据内容并不会发生改变,当我们提交事务之后,才会看到最新的数据。
查看隔离级别:
SELECT @@global.tx_isolation;
更改隔离级别:

SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;

5.2 大文本数据

存储大文本:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT
存储大量字节;TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB
当我们想在数据库中存储大文本或二进制数时,会用到如上数据类型。值得注意的是,当我们使用JDBC的时候,获取以及写入的时候需要使用写入流和输出流。除此之外还有SET集合类型和ENUM枚举类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值