数据库基础-事务(transaction)笔记

为什么需要事务呢

在数据库中,真实的情况往往是多个用户共享一个数据库,多个用户可能同一时间去访问或修改同一部分数据,这样可能导致数据库中的数据不一致,transaction概念应运而生

多个用户会导致什么问题呢

当多个用户访问数据库并发访问时,可能会导致丢失更新,脏读,幻读,不可重复读等问题

问题含义
丢失更新(lost update)指当2个或者多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,因此最后的更新将重新由其他事务所作的更新,这将导致数据丢失
脏读(dirty read)指一个事务正在访问数据,而其他事务正在更新该数据,但是尚未提交,此时就会发生脏读问题,即第一个事务所读的数据“脏”数据,也就是不正确数据。它可能引起错误
不可重复读(unrepeatable read)当一个数据多次访问同一行数据且每次读取不同的数据时,会发生此问题。不可重复读与脏读有相似之处,因为该事务也是读取其他事务正在更改的数据。第一次读取和二次读取数据不一致,这就是不可重复读
幻读(phantom read)当一个事务对某行执行插入或者删除操作,而该行属于某个事务正在读取的行范围时,会发生幻读问题

事务ACID原则

在形式上每个事务都要满足ACID原则,即原子性,一致性,隔离性,持久性

语句含义
原子性(atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(consistency)事务前后数据的完整性必须保持一致。
隔离性(isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

事务创建

1.开始事务

begin {tran|transaction}事务名 [with mark['description']]

说明

  1. tran是transaction的缩写,意思是一样的
  2. 事务名:分配的事务名,必须遵循标识规范,字符长度不能超过32位
  3. with mark[‘description’]:指定在日志中标记事务。description是描述该标记的字符串。如果使用了with mark,则必须指定事务名

2.结束事务

commit {tran|transaction}[事务名]

3.撤销事务

rollback {tran|transaction} [事务名|@事务名变量]

说明

  1. rollback transaction语句不能在commit语句之后

4.回滚事务

save [tran|transaction][事务名|@事务名变量]

说明
rollback tran语句除了能够撤销整个事务外,还可以使事务回滚到某个点,用sava tran语句来设置这个保存点

5.实例解释

begin transaction mytran1					/*开始一个事务*/
update...
delete...
save transaction s1							/*设置一个保存点*/
delete...
rollback transaction s1;					/*回滚事务至s1保存点*/
insert...
commit transaction							/*提交事务*/

最后结束这个事务时,只有2,3,7句对数据库的做的修改持久化

设置数据库事务隔离级别

.在数据库中可以使用set transaction isolation level语句来设置事务隔离的级别

set transaction isolation level
{
	 read uncommitted
	|read committed
	|repeatable read
	|snapshot
	|serializable
}
等级说明
read uncommitted(未提交读)允许脏读,但是不允许丢失更新。如果一个事务已经开始写数据,则不允许另外一个事务同时进行操作,但是允许其他事务读取此行数据
read committed(提交读 )提交读是数据库的默认级别,能够避免脏读,允许不可重复读。处于这一级别的事务可以看到其他事务添加的新记录,而且其他事务对现存记录做出的修改,一旦被提交,也可以被修改。意味着在事务处理期间,如果其他事务修改了相应的表,那么同一个事务的多个select语句可能返回不同的结果(recommendation
repeatable read(可重复读)不允许不可重复读和脏读,但是有时可能出现幻读。读取的事务将会禁止写事务(但是允许读事务)。写事务则禁止其他任何事务
snapshot(快照)处于这一级别的事务只能识别在其开始之前提交的数据修改。在当前事务中执行的语句将看不到在当前事务开始以后以及由其他事务所作的修改。其效果就像在事务中获取得了已提交数据的快照。使用这个级别的隔离事务必须先开启:alter database 数据库名 set allow_snapshot_isolation on
serilaizable(序列化)隔离级别最高,他要求事务序列化执行,事务只能接着一个一个去执行,不能并发执行

隔离级别越高,越能保证数据的一致性,完整性,但是对并发的影响也就越大
一般推荐使用committed read级别

系统变量-@@TRANCOUNT

事务是可以嵌套的,@@TRANCOUNT用于报告当前等待处理的嵌套事务的数量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值