mysql学习之数据库事务
数据库事务
什么是数据库事务
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在计算机术语中,事务通常就是指数据库事务。
一个数据库事务通常包含对数据库读取或者更改的操作,该事务的存在有两个目的:
1、为数据库的操作提供一个 从操作失败到正常状态的方法,同时数据在异常状态下仍然能保持一直的方法
2、当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
数据库事务的特性
事务具有4个属性:原子性、一致性、隔离性、持久性。
原子性
事务被作为一个整体执行, 事务中的操作 要么全部执行 要么就全部不执行
一致性
事务不论是否成功执行 ,都应保证 数据库的一致状态,也就是数据满足数据库的完整性约束
隔离性
一个事务执行时 不应影响其他事务的执行
持久性
一个事务提交后,对数据的修改应永久保存
如何实现数据库事务
MySQL中如何开启、提交 、回滚事务
- begin/start transaction,ROOLBACK ,COMMIT
- begin/start transaction 开始一个事务
- rollback 事务回滚
- commit 事务确认
- 用SET来改变mysql的自动提交等级
- SET AUTOCOMMIT=0禁止自动提交
- SET AUTOCOMMIT=0开启自动提交
事务的隔离等级
并发事务处理带来的问题
- 更新丢失
因为 每个事务之间都不知道其他事务的存在,所有当两个或者多个事务 对同样的数据进行操作,从数 据库中取到的是初始数据。
所以会发生一个事务把 另外一个事务所做的对数据库的更新 进行覆盖
这就是更新丢失 - 脏读
一个事务 A对数据进行了操作,但是还未提交时 ,如果不加控制 ,事务B来读取数据库中事务A已操作的**‘脏’数据**。这时如果事务A回滚,事务B进行对脏数据的操作并提交事务,就会违背一致性 - 不可重读
一个事务在执行的不同周期 访问到的数据值 不相同 (也就是访问到其他事件对数据库操作后的数据值),违背了隔离性 - 幻读
一个事务在执行的不同周期 检索到的数据数量不相同(事务A 访问到事务B提交的数据)
违背了隔离性
事务的隔离等级
事务的隔离级别越低,可能出现的并发异常越多,但是通常而言系统能提供的并发能力越强。
select @@transaction_isolation; --查看当前隔离级别
- 读未提交
- 读已提交
- 可以重复读
- 串行化
在jdk新版本中 可重复读隔离等级 已经消除了幻读
行锁与表锁
所有的事务实现,处理并发冲突,都需要依赖锁来实现。
一般分为两类
1.悲观锁
悲观锁 就是认为其他事物随时可能修改欲操作的数据,所以在执行数据时 将该数据加锁,这样就不让别人操作该数据
关系型数据中的行锁,表锁,读写锁都是悲观锁
2.乐观锁
乐观锁 就是认为没有事物会修改欲操作的数据,仅在操作前检查一遍数据
表级锁定(table-level)
就是对整个表进行锁定,外界事务无法操作该表,只能读取
表级锁定是mysql数据库各引擎的最大颗粒度的锁定机制所以释放加锁都特别快,但是占用 锁定资源率最高,
所以并发度很低
行级锁定(row-level)
就是对该行进行锁定,外界事务无法操作该行,只能读取
行级锁定就是锁定对象的颗粒度很小,占用锁定资源率不高,所以并发度很高,但是因为颗粒度很小,每次释放和加锁所做的事情都会更多
表级锁:开销小,加锁快;较难出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:开销大,加锁慢;容易出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;