数据库(6)事务

11.TCL事务管理语言

事务:一个或一组SQL语句组成的一个执行单元,这个单元要么全部完成,要么全部失败

ACID

事务的属性:

1.原子性:一个事务是不可再分的工作单元

2.一致性:事务必须是数据库从一个一致的状态转换到另一个一致的状态

3.隔离性:一个事务的执行,不能被其他事务干扰

4.持久性:一个事务一旦被提交它对数据库的改变是永久有效的

11.1 存储引擎

定义:数据库中使用不同的存储技术将数据存储在文件中

# 查看当前数据库支持的存储引擎
SHOW ENGINES;

注意点:
1、innodb是mysql默认的存储引擎
2、innodb是支持事务的,myisam,memory不支持事务

11.2 事务的创建

隐式事务:事务的开启与结束没有明显的标记

显示事务:事务具有明显的开启与结束标志

查看事务有没有开启
show variables like 'autocommit'

显示开启事务
	前提条件:关闭自动提交  set autocommit=0
	具体格式
	set autocommit=0;
	start transaction;
	执行语句1
	执行语句2
	........
	commit(提交)|rollback(回滚)
	
delete和truncate
delete可以使用rollback回滚
truncate不能使用rollback回滚

11.3 数据库的隔离级别

对于多个事务运行时,如果事务访问的是相同的数据,如果没有设置隔离级别,就会出现并发问题

11.3.1 事务的并发问题

并发问题具体体现
脏读对于两个事务,t1,t2,如果T1读取了已经被t2修改过的但是还没有提交的数据,但是最后t2回滚了,t1读取的内容是临时并且无效的
不可重复读对于两个事务,T1,T2读取了一个字段的值,但是T2更新了这个字段,T1再次读取的时候,两读取的数据是不一致的
幻读对于两个事务T1,T2,T1从一个表中按照一定的条件读取数据,接着T2将表进行了更新,插入几行新数据,当T1再次以相同的条件进行读取的时候,会出现新的数据

不可重复读更加侧重于对于数据的修改

​ 解决方法:将满足条件的行锁起来

幻读更侧重数据的增加和删除

​ 解决方法:锁表

11.3.2 隔离级别

隔离级别说明
未提交读(读取未提交的数据)允许事务读取未被其他事务提交的更改,所以脏读、不可重复读、幻读都会出现
已提交读(读取提交内容)只允许事务读取已经被其他事务提交的更改,能够解决脏读问题,但是不可重复读和幻读没有解决
可重复读(可重读)确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务多这个字段进行更新,可以避免脏读和不可重复读,但是幻读还是会出现的
可序列化(可串行化)确保事务可以从一个表中读取相同的行,在这个事务持续期间,不允许其他事务对于表数据执行插入,更新和删除操作,会解决所有的并发问题,但是性能很低
数据库支持的隔离级别
oracle2种,已提交读,可序列化,默认的是已提交读
mysql4种,默认的是可重复读

11.3.3 设置隔离级别

设置隔离级别
# 未提交读
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

#可提交读
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

#可重复读
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

# 可序列化
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值