事务简介

事务
事务定义:
事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰。作为一名软件设计师,必须了解事务并合理利用,以确保数据库保存正确、完整的数据。数据库向用户提供保存当前程序状态的方法,叫事务提交(commit);当事务执行过程中,使数据库忽略当前的状态并回到前面保存的状态的方法叫事务回滚(rollback)。
事物的特性
事物有四个特性,人们简称为ACID。下面详细介绍:

原子性:将事务中所做的操作捆绑成一个原子单元,即对于事务所进行的数据修改等操作,要么全部执行,要么全部不执行。

一致性:事务在完成时,必须使所有的数据都保持一致状态,而且在相关数据中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构都应该是正确的。

隔离性:由并发事务所做的修改必须与任何其他事务所做的修改相隔离。事务查看数据时数据所处的状态,要么是被另一并发事务修改之前的状态,要么是被另一并发事务修改之后的状态,即事务不会查看由另一个并发事务正在修改的数据。这种隔离方式也叫可串行性。

持久性:事务完成之后,它对系统的影响是永久的,即使出现系统故障也是如此。
并发访问可能引起的问题
1.读脏数据。这个好理解,如果第一个事物修改数据,但是没有提交,而第二个事物读取了第一个事务修改的数据,但是,此时,第一个事物回滚了事物,这就导致第二个事务读的数据是假的,错的。我可能想到的办法了,在修改期间,把所修改的记录锁着,在修改完成前,别的事务不能读取到这些记录
2.不可重读 :如果一个事务(我们记为第一个事务)中包含了两天读取一样数据的select语句,比如
start
select × from table where id=1 ;
//1标记
select x from table where id=1;
end;其中『1标记』处,我们可以理解为做一些逻辑处理。当这个事务在执行了『1标记』的时候,另外一个事务(我们记为第二个事务),修改了这条记录。同时提交。这个时候第一个事务的第二次查询语句就执行了,结果读取出来的数据就和第一次不同了。这就是不可重读。
解决办法:如果第一个用户在两次读取之间锁住要读取的记录,别的用户不能去修改相应的记录就能避免这种情况
3.幻读 :这个和『不可重读』发生的条件基本差不多。如果一个事务(我们记为第一个事务)中包含了两天读取一样数据的select语句,比如
start
select × from table where id=1 ;
//1标记
select x from table where id=1;
end;其中『1标记』处,我们可以理解为做一些逻辑处理。当这个事务在执行『1标记』的时候,另外一个事务(我们记为第二个事务),插入或者删除了一些记录,同时提交。这个时候第一个事务的第二次查询语句就执行,结果读取出来的数据就和第一次不同了,多了几条或者少了几条数据。这就是不可重读。
解决办法:如果第一个用户在两次读取之间锁住要读取的记录,别的用户不能去修改相应的记录,也不能增删记录,就能避免这种情 况。

对所有可引用的类型(如行,页或者表)加一个锁,这个锁只要是开的时候,事务才可以进去,否则就在们外排队等着,相当于java中线程的同步。当事务进入这个加锁的类型以后,将锁锁着。当事务离开的时候,把们打开。以供其他事务引用。根据引用类型的不同,我们定义一下锁
表类型:锁定整个表
行类型:锁定一行
文件类型:锁定一个文件
数据库类型:锁定整个数据库
页类型:锁定8k为大小的数据库页
我们都明白,锁的范围越大,产生的阻碍就越大,也就会越影响系统的性能。所以锁要用的合适,否则效果会适得其反。
事务隔离
为了解决上面的并发引起的问题。我们使用事务隔离来实现。主要有4个事务隔离
1.读取未提交
2.读取以提交
3.可重复读
4.可序列化
读操作未提交(Read Uncommitted):说明一个事务在提交前,其变化对于其他事务来说是可见的。这样脏读、不可重读和幻读都是允许的。当一个事务已经写入一行数据但未提交,其他事务都不能再写入此行数据;但是,任何事务都可以读任何数据。这个隔离级别使用排写锁实现。
读操作已提交(Read Committed):读取未提交的数据是不允许的,它使用临时的共读锁和排写锁实现。这种隔离级别不允许脏读,但不可重读和幻读是允许的。
可重读(Repeatable Read):说明事务保证能够再次读取相同的数据而不会失败。此隔离级别不允许脏读和不可重读,但幻读会出现。
可串行化(Serializable):提供最严格的事务隔离。这个隔离级别不允许事务并行执行,只允许串行执行。这样,脏读、不可重读或幻读都可发生。
简单的描述,希望有用,同时有出错的地方,还请指正
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值