事务的概念:是用户定义的一个数据库操作序列,这些操作要么全部做,要么全部不做,是一个不可分割的工作单元。一个事务可以是一条SQL语句,一组SQL语句或者是整个程序。一般来说,一个程序中会包含多个事务。事务的开始与结束可以由用户显示的控制,如果用户没有显示的定义事务,则由DBMS按照缺省规定自动划分事务。 在SQL中,定义事务的语句有三条: BEGIN TRANSACTION ?/ ?COMMIT ?/ ROLLBACK。
?
事务的四个特性:
? ? ? ? ? 原子性:事务是数据库的逻辑工作单元,事务中包括的操作要么全部做,要么全部不做。
? ? ? ? ? 一致性:事务执行的结果必须是使数据库从一个一致性状态到另一个一致性状态。如果在事务操作的时候,所有的操作都成功提交时,就说数据库处于一致性状态。如果数据库系统运行时发生故障,有些事务尚未完 ? ? ? ? ? ? ? ? ? ? ? ? ? 成就被迫中止,这些写未完成的事务对数据库所做的修改有一部分已经写入物理数据库,这是数据库就处于一种不正确的状态。可见一致性与原子性是密切相关的。
? ? ? ? ? 隔离性:一个事务的执行不能被其他事务干扰。各个并发执行的事务之间不能相互干扰。
? ? ? ? ? 持续性(持久性):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
事务的运行:事务可以一个一个的串行执行,也就是说每个时刻只能运行一个事务,其他事务必须要等到这个事务运行完成之后,才能运行。但是事务在执行的过程中,可能需要不同的资源,有时候需要CPU,有时候需要存取数据库,有时候需要I/O,有时候需要通信,如果事务串行执行,则许多系统资源将会处于空闲状态,因此为了充分利用系统资源,应该允许多个事务并行运行。
事务的并行执行(单处理机):事务的并行执行实质上是这些并行事务的并行操作轮流交叉运行。在一个多处理机系统中,可以实现真正上的同时并发执行方式。
?
注意:事务是并发控制的基本单位。在事务的并行执行过程中,可能会涉及到多个事务同时存取同一条数据,可能会造成数据被破坏。因此出现了加锁技术。
?
封锁(加锁):它是实现并发控制的一个非常重要的技术。(例如:一个事务A对某个数据对象如表或者记录等操作之前,先向系统发出请求,对其加锁。加锁之后事务A就对该数据对象有了一定的控制,在事务A没有释放所之前,其他事务死不嗯呢该更新次数据对象的)它分为写锁和读锁。
写锁:在一个事务A中为某个数据对象加入了一个写锁,则只允许A对数据进行读取和修改操作,其他事务都不能对该数据对象进行加锁,知道A将锁释放掉,其他事务才可以对它进行操作。(通俗点:就是一个事务如果加的是写锁,其他事务都不能对她加锁)。
读锁:如果事务A对一个数据加了读锁,那么只允许A对数据进行读取,不能进行修改操作,其他事务也可以对该数据进行加读锁操作,但是不能加写锁操作。
?
活锁:事务A加锁了数据X,然后事务B又请求加锁数据X,接着事务C又请求加锁数据X,当A释放掉数据X的锁之后,系统将数据X先交给了事务C,然后事务D又请求加锁数据X,当事务B使用完之后,系统又将数据X交给了D,这样事务B就一直处于等待状态,这种情况就是所谓的活锁状态。解决此种方法可以使用:先来先服务的策略。
?
死锁:当事务A在加锁了数据X之后,需要数据Y,同时,事务B在加锁了数据Y之后,需要数据X。两者都不释放自己的那一部分资源,就都处于一直等待转态,此种情况就是死锁。
?
解决死锁的几种方案:
? ? ? ? ? ? ? ? 1.死锁的预防
? ? ? ? ? ? ? ? ? ? ? ? ?1.1一次封锁法:将事务A所需要的数据全部加锁,否则不能执行。这种方法暴漏出来的几个特点:当数据量过大时,会降低熊的并发度;
? ? ? ? ? ? ? ? ? ? ? ? ?1.2顺序加锁法:预先对数据规定一个封锁顺序,所有的事务都必须按照这个顺序实行封锁。
? ? ? ? ? ? ? ? 2.死锁的诊断与解除:
? ? ? ? ? ? ? ? ? ? ? ? ?2.1.超时法:规定一个时间,如果某个事务超过了规定的时间,就认为是死锁。
? ? ? ? ? ? ? ? ? ? ? ? ?2.2等待图法
并发调度的可串行化:多个事务的并发执行时正确的,当且仅当其结果与按照某一次序串行的执行这些事务时的结果相同,称这种调度策略为可串行化。
?
两端锁协议(数据加锁的一个公共规则):事务分为两个阶段,第一阶段是获得封锁,在这阶段,事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁。第二阶段是释放封锁,在这阶段,事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁。 ??
? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
编程式事务:编程式事务需要你在代码中直接加入处理事务的逻辑,可能需要在代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法,如在执行a方法时候需要事务处理,你需要在a方法开始时候开启事务,处理完后。在方法结束时候,关闭事务。
?
声明式事务:声明式的事务的做法是在a方法外围添加注解或者直接在配置文件中定义,a方法需要事务处理,在spring中会通过配置文件在a方法前后拦截,并添加事务.
?
?两者区别:编程式事务侵入性比较强,但处理粒度更细.
?
?--------------------------------------------------------------Java中的事务分类(下面为转载)------------------------------------------------------------------------
转自:http://lavasoft.blog.51cto.com/62575/53815/
内容如下:
?
?
原文:http://ihenu.iteye.com/blog/2276576