目录
一.事务的特性:
简单来说, 就是ACID 事务特征;
- 原子性(Atomicity):事务是一个整体的工作单元,事务对数据库所作的操作, 要么全部取消, 要么全部执行,如果执行失败,执行语句将全部回滚;
- 一致性(consistency):事务在完成时, 必须使所有的的数据都保持一致性,在相关数据库中,所有的规则都必须应用于事务的修改, 以保持数据的完整性,如果事务成功,则所有数据变成一个新的状态, 如果失败, 则数据处于开始之前的状态;
- 隔离性(isoleted):事务与事务之间是没有任何关系的,是相互隔离的;
- 持久性(durability) :当事务提交后, 对于数据来说就保存下来了;
二.事务的模式:
- 自动提交事务:每条单独的语句都是一个事务;
- 显式事务:每个事务均以begin tran 语句显式开始, 以commit 或者rollback 显式结束
- 隐式事务:当前一个事务完成时, 重启另一个隐式事务,但是每个事务仍然以commit 或者rollback显式完成;
三.事务的并发产生的问题
在没有考虑到锁定情况来讨论:
- 脏写:(两个事务针对同一条数据修改)
当两个事务或多个事务选择同一行,都要对这条数据更新,这样相互更新对方消息, 导致数据丢失, 或者覆盖了有用的数据
- 脏读:(未确认的相关性):脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读取到了并不一定存在的数据,成为脏读;
举例说明:(两个事务一个修改执行失败造成回滚,, 一个读取失败前的数据, 造成的)
就好比:就好比你们两个人谈生意, 你们只是看了一下对方的合同,并没有盖章, 你认为这个合同有用吗, 有可能带来很大的损失;
- 不可重复读:不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况。
举例说明:({一部分,或者一条数据}, 关键在于数据内容的读取)[a事务对数据进行修改, b事务进行查询,但是呢, 只要a这个修改一直在持续, b就没有办法查询到一直都数据]
和供应商签合同, 你们在看相同的合同,商量合同事宜, 照理来说,我们两份合同应该一模一样(总共10条内容),但是供应商太狗了不满一些条款, ,没过一会,他就修改内容, 导致你tm 也不知道那个是对的, 每次都是不一样的10条数据(只是内容改变, 合同的条款是没有增加或减少的)
- 幻读:并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。
举例说明:(针对的是整个数据表,但是也包含了不可重复读)
你和供应商签合同, 你们在看相同的合同,商量合同事宜, 照理来说,我们两份合同应该一模一样(总共10条内容),但是供应商太狗了,没过一会,加了内容关键是还没有告诉你, 每次都是不一样的条款项目(数量增多或者减少, 但是内容有可能变)_ 你还在想,明明有的条款,现在怎么没有了呢?,
事务的隔离级别;
1.读未提交(Read uncommitted):
这种事务隔离级别下,select语句不加锁。
此时,可能读取到不一致的数据,即“读脏 ”。这是并发最高,一致性最差的隔离级别。
2.
可避免 脏读 的发生。
在互联网大数据量,高并发量的场景下,几乎 不会使用 上述两种隔离级别。
3.可重复读(Repeatable read):
MySql默认隔离级别。
可避免 脏读 、不可重复读 的发生。
4.串行化(Serializable ):
可避免 脏读、不可重复读、幻读 的发生。
sql server 的默认隔离级别:读已提交(Read committed)
mysql 的默认隔离级别:可重复读(Repeatable read)
orcale的默认隔离级别:读已提交(Read committed)