精华内容
下载资源
问答
  • 数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为 Read uncommitted:允许脏读。 Read committed: 防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别。 Repeatable read:可以防止脏...
  • 事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度
  • 数据库事务隔离级别与实现原理

    千次阅读 2019-03-11 10:52:29
    事物的四大特性,即常说的ACID: 1、原子性(Atomic):指的... 3、隔离性(Isolation):指的是多个事物并发执行的时候、一个事物的执行不应当影响到其它的事物、即事物与事物之间是隔离的。 4、持久性(Durabil...

    事物的四大特性,即常说的ACID:

    	1、原子性(Atomic):指的是事物所有的操作要么全做、要么全不做。
    	2、一致性(Consistency):事物应该确认数据库从一个一致状态转变为另一个一致状态。(数据库中的数据应满足完整性约束)
    	3、隔离性(Isolation):指的是多个事物并发执行的时候、一个事物的执行不应当影响到其它的事物、即事物与事物之间是隔离的。
    	4、持久性(Durability):指的是一个事物一旦提交、它对数据库的修改应该永久保存在数据库中。
    

    说完了事物、说一下事物并发引起的问题:

    	1、更新丢失---即一个事物的更新覆盖了另一个事物的更新。导致另一个事物的更新丢失。
    		比如、你和你妻子共同有个银行账户、里面原来有1000块钱、你这个月发工资了、把你的4300块钱
    		的工资存入了银行,本来应该有5300块钱的工资。但是在这个过程中、你妻子去取钱、她想取500
    		买个口红、结果取得过程中、银行的取钱系统出故障了、导致数据回滚、然后银行的账户变成了	
    		1000、这个时候你存入的4300块钱就不莫得了。
    	2、脏读---指的是一个事物读到了另一个事物未提交的数据。 
    		还是上面的场景、当你存钱的时候、你妻子正在查询余额、这个时候你还没存成功、你妻子查询出
    		来的账户余额有5300、然后存钱系统出故障了,导致存钱失败。你妻子看钱多了、打算买了1500的
    		口红、但是取得时候提示余额不足。所以你晚上回去就跪搓衣板了。
    
    	3、不可重复读 --- 在一个事物中、对同一数据进行两次读取。但是读取到的结果不一致。
    		上面的场景重现、在你存钱之前、你妻子想把账户里面所有的钱取出来。但是忘了账户里面还有多
    		少钱、查询了一下还有1000,这个时候你不是存钱了而是打算取100块钱买包烟。等你取完之后、
    		你妻子接了个电话、聊了十几分钟、挂了电话后完了自己卡里面有多少钱了,又查了一次、这个时
    		候查到了900块。但是你妻子又想起了第一次看还有1000的现在就剩900了。然后。。。。凉了
    	4、幻读-----在一个事物中、一个语句查询出来的结果不一致(不可重复读的不一致、指的是数据修
    	改、而幻读的不一致指的是新增或者删除)。即第一次读取到的数据相比较第二次少了几条或者多了
    	几条就好像产生了幻觉一样。
    

    下面说一说解决事物并发问题的方案、即事物隔离级别:

    	1、读未提交(read-uncommitted):这种隔离级别下、会解决更新丢失的问题、出现脏读、不可重复读和幻读的问题。
    	2、读已提交(read-committed):这种隔离级别下会出现不可重复读和幻读的问题。(这是Oracle的默认隔离级别)
    	3、可重复读(repeatable read):这种情况下会出现幻读的问题。(这是mysql默认的隔离级别、其实mysql在这种隔离级别下解决了幻读的问题)
    	4、串行化(serializable):这种隔离级别最高、也是最慢、它是以串行化的方式执行的。解决所有的并发问题。
    

    测试用到的sql语句

    由于篇幅限制、暂时就不将测试的图片贴上来了。给出一些测试中用到的dml和ddl语句。
    		
    查询事物隔离级别的sql语句: SELECT @@tx_isolation
    设置事物隔离级别: SET GLOBAL | session TRANSACTION ISOLATION 
    level [READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE]
    例如将数据库全局的隔离级别设置为读未提交 : SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    将数据库的当前session设置为可重复读的级别:SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    查询数据库的自动提交是否开启:show variables like 'autocommit'
    如果开启手动将其关闭: SET autocommit = off       ps:这个只是关闭当前session的
    

    最后的重点就是mysql是如何在RR(Repeatable Read)下解决幻读问题的

    	首先、事物的并发是通过加锁的方式来解决。
    	但是这种锁不是常说的读锁(共享锁)或者写锁(排他锁)。而是叫next-key锁。
    	next-key锁就是行锁+gap锁(间隙锁)。
    	官方给出的解释是:间隙锁是锁定索引记录之间的间隙。或锁定在第一个或最后一个索引记录之前的
    	间隙。例如select * from table where id between 1 and 10 是锁定1-10的间隙。
    	总结下来就是:
    		首先、如果where条件全部命中、则不会加gap锁、只会加记录锁。
    		如果条件全部命中或者部分命中则会加gap锁。
    		当整个语句不走索引的时候、会进行锁表。   
    
    展开全文
  • 为什么会出现数据库隔离级别呢? 数据库隔离级别是为了解决数据库并发访问过程中产生的各种数据安全问题. 事务的基本要素(ACID) 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能...
  • 数据库事务: 针对数据库的某一组操作要么全部成功,要么全部失败。 事务的作用 1:保证数据的完整性,失败后可以恢复到原来状态 2:事务与事务之间互不干扰,这样数据会更加安全 数据库事务ACID属性 / 特性 原子性...
  • 1.数据库事务 根据百度百科,数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的...

    1.数据库事务

            根据百度百科,数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

            其实transaction也可以翻译成交易,比如大家耳熟能详的银行转账交易。交易成功的核心就在于A账户的转出操作与B账户的转入操作是否都能成功。

     

    2.事务四大特性简介

            众所周知,事务还有ACID四大特性,分别为原子性,一致性,隔离性和持久性。下面简述一下四大特性:

            1)原子性:事务的定义中就包含了这个概念,即事务中包含的操作必须保证全部执行,不能部分执行。

            2)一致性:如果事务中的操作全部执行或者全部不执行,我们可以说此时的数据是保持一致性的,只不过如果全部成功,是从一种一致性到另外一种一致性;如果全部失败,数据也是一致的,即与事务开始前的数据保持一致。后面讲到一致性的实现时会再具体阐述。

            3)隔离性:比如现在有两个事务T1和T2,假设T1先开始,T2后开始,并且两个事务中都会用到数据D,那么针对于在T2执行期间能否看到T1操作后的数据D的问题,则是后面会提到的隔离级别的问题,此问题涉及到事务的隔离性。

            4)持久性:凡是提到持久性,必然涉及到将数据写入磁盘的操作,以避免断电导致的数据丢失问题。

            以上关于事务的定义和事务的四大特性只是概念性的描述,网上随便一搜都能找到,但是要想真正理解事务及其特性,就不得不了解其实现原理。如果想要彻底了解,需要先把知识分层,上面提到的事务及其四大特性是数据库原理层面的,也就是说无论用的是MySQL还是其他诸如Oracle或者是其他数据库,事务的概念和特性是一样的,但是具体到某一种DBMS(即常说的数据库软件例如MySQL),其实现细节会有所区别。

     

    3.原子性,一致性和持久性实现原理

            下面以MySQL为例,详细描述一下MySQL是如何实现原子性,一致性,隔离性和持久性的。在具体讲MySQL的四大特性的实现原理之前,我们首先对MySQL是什么做个简单的定义,MySQL=程序+文件(配置文件,日志文件,数据文件)。简单来说MySQL是一个软件,此软件是由管理数据的程序和各种文件组成的,其中文件又包含了不同的类别。所以我们常见的CRUD操作,本质上就是通过程序创建,检索,更新或者删除文件

            在讲之前,我们先来想一下如果让你来实现原子性和一致性,你会怎么做?假设现在有一个事务,包含A,B,C三个插入操作,假设执行到C时,程序出错,那么此时数据文件中只包含了A和B两个操作的数据。之前已经讲过,原子性的含义是全部执行或者全部不执行,那显然如果我们能捕获程序错误,然后回滚A和B操作,或者重试C操作,那么就能保证原子操作。那么如何回滚A和B?又如何重试C呢?我们可以把回滚信息存入文件,把事务信息也存入文件。MySQL的做法就是将事务信息写入redo log(即重写日志),而回滚信息写入undo log(即回滚日志)。所以通过redo和undo日志文件,MySQL实现了事务的原子性和一致性。其实此处的一致性只是保证了事务不会只被执行一部分操作,并不能保证事务一定会执行。之所以这么说是因为MySQL为了保证一致性,会先将redo日志写入磁盘,然后再写入数据文件,假如在写数据文件时MySQL挂掉了,当重启MySQL后程序会检查redo日志中记录的日志是否正常提交或者回滚,如果没有则会根据不同的策略选择来继续写数据文件或者是回滚。MySQL其实通过redo和undo日志同时也实现了持久性。

     

    4.隔离级别简介

            前三个特性讲完了,接下来讲下隔离性,在讲这个特性之前,先要说下什么是隔离级别?与事务的定义类似,隔离级别也是一个通用的概念,ISO和ANSI SQL标准中定义了四种隔离级别,分别为未提交读,提交读,可重复读和可串行化。下面我将通过图例来分别讲解下这四种隔离级别的含义。SQL标准虽然定义了一套关于隔离级别和问题的对应关系,但是各个数据库实现并不相同,并不是所有数据库都实现了SQL标准的四个隔离级别。下面以MySQL为例来对隔离级别做个简单介绍。假设有两个事务A和B,且两者均会操作Account表中的某一行数据。

            1)未提交读

    时间

    转账事务A

    转账事务B

    t1

    开始事务

     

    t2

     

    开始事务

    t3

    查询Account账户余额为0

     

    t4

    修改Account账户余额为500

     

    t5

     

    读取Account账户(500)

    t6

    修改Account账户余额为0

     

    t7

    提交事务

     

            当事务隔离级别为未提交读时,事务B可以在事务A提交之前就能读取的中间数据,但是大家可以很明显的看出,此时B中数据其实是个脏数据。也即我们常说的未提交读会导致脏读问题。

            2)提交读

    时间

    转账事务A

    转账事务B

    t1

     

    开始事务

    t2

     

    读取Account账户余额为0

    t3

    开始事务

     

    t4

    查询Account账户余额为0

     

    t5

     

    读取Account账户(阻塞)

    t6

    修改Account账户余额为500

     

    t7

    修改Account账户余额为100

     

    t8

    提交事务

     

    t9

     

    读取Account账户(100)

            当事务隔离级别为提交读,事务B开始时读取了一次账户信息,事务A提交后又查询了一次,两次结果不一样。很明显,此处出现了我们常说的不可重复读的问题,即B事务开始读取时为0,最后又读一次变为100。

            3)可重复读

    时间

    转账事务A

    转账事务B

    t1

     

    开始事务

    t2

     

    读取Account账户余额为0

    t3

    开始事务

     

    t4

    查询Account账户余额为0

     

    t5

     

    读取Account账户(0)

    t6

    修改Account账户余额为500

     

    t7

     

     

    t8

    修改Account账户余额为100

     

    t9

    提交事务

     

    t10

     

    读取Account账户(0)

            当事务隔离级别设置为可重复读,则事务B的读取操作不会影响到事务A。但是此时还可能有一个问题,那就是可能出现“幻读”,即如果事务B读取时没有记录,但是其他事务插入了一个新行,事务B再次读取某个范围时会查询到新插入的行,此行称为“幻行”。对于MySQL来说,可重复读是默认隔离级别,且MySQL通过MVCC和Next-Key Locking来实现可重复读,所以对于MySQL的可重复读来说,不存在幻读问题。(注:SQL标准的隔离级别和相关问题的对应关系。https://blog.csdn.net/qq_36431213/article/details/86497493)

            4)可串行化

            确保数据的一致性且可以接受没有并发。

     

    5.隔离性实现原理

            上面已经大体描述了隔离级别的含义,下面我们就来具体看下MySQL是如何实现事务隔离性的?简单来说,在MySQL中,事务的隔离性是通过锁来实现的。MySQL中有三种行锁算法,Record Lock(单行锁定),Gap Lock(间隙锁)和Next-Key Locking(Record+Gap)。在讲之前,还需要说到一个MySQL的特点,那就是MySQL有两种读取数据的模式,一种是一致性非锁定读,另一种是一致性锁定读。

          先说一下一致性锁定读:

            1)SELECT ...  FOR UPDATE (显式加写锁)

            2)SELECT ...  LOCK IN SHARE MODE (显式加读锁)

          再谈一下一致性非锁定读:

            一致性非锁定读的含义是当事务读取的某行数据被其他事务锁定时,可以不用等待锁释放,而是读取此行的一个具有一致性的数据快照,而这个快照数据就存储在undo日志中。这种一行数据有多个版本的技术也叫做MVCC,即多版本并发控制。MVCC也是一个通用概念,有多种实现方式,MySQL是通过undo日志来实现的MVCC。

            接下来我们继续讲解MySQL是如何实现四个隔离级别的:

            1)未提交读:显然不需要对行加锁,这样其他事务就可以同时访问此行。

            2)提交读:在InnoDB的默认配置下,此隔离级别采用一致性非锁定读模式。即如果此行正被其他事务锁定,那么MySQL通过MVCC技术,当前事务可以读取此行的一个最近提交的快照数据。

            3)可重复读:在InnoDB的默认配置下,此隔离级别采用一致性非锁定读模式。MySQL通过Next-Key Locking锁定一个范围,使范围内的数据不能同时在其他事务中插入,避免了当前事务出现“幻行”问题。MySQL通过MVCC,在读取某行数据时,如果此行被其他事务锁定,则当前事务不用阻塞,直接读取当前事务开始时的此行的一个数据快照,来解决可重复读问题。即在整个事务中,读取的始终是此行的同一个数据快照。MySQL的可重复读已经达到了SQL标准的Serializable标准,即(无脏读,可重复读MVCC,无幻读Next-Key Locking)。

            4)可串行化:串行化执行事务,即发现有其他事务正在操作此行,则此事务阻塞直到其他事务结束。MySQL会对每个select加上lock in share mode,不支持一致性非锁定读。

            扩展:我们在真实使用事务的时候,常见场景有通过Spring配置数据源,配置ORM映射框架例如Mybatis,在使用事务的时候本质上是利用数据库的API,例如对于MySQL来说是begin, commit和rollback等。获取数据库连接,开启事务,提交事务等。Spring中的事务传播机制属于Spring自己的概念,本质上为根据不同的事务传播机制确定是否利用同一个连接,或者是否将多个事务逻辑通过同一个Connection或者多个Connection中来提交或者回滚,有兴趣的可以看下Mybatis关于事务的源码。

            关于MySQL的ACID实现原理其实是比较复杂的,网上也很难找到比较完整的描述,本文也只是简单介绍,如果想要具体更细致的了解相关原理,推荐两本书《MySQL技术内幕InnoDB存储引擎》和动物书《高性能MySQL》,欢迎大家留言交流。

     

     

    展开全文
  • 数据库事务隔离级别

    2011-12-19 14:09:53
    介绍数据库事务的四种隔离级别,比较不同隔离级别的区别和影响
  • 持久性(Durability):持久性指对于任意已提交事务,系统必须保证该事务数据库的改变不被丢失,即使数据库出现故障。 2. 隔离级别 Serializable(串行化):可避免脏读、不可重复读、幻读的发生。 Rep
  • 一直没搞清楚spring事务与数据库事务与锁之间的关系。 spring事务: spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁; ...

    一直没搞清楚spring事务与数据库事务与锁之间的关系。

    spring事务:

    spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁;

    那么事务的隔离级别与锁有什么关系呢?本人认为事务的隔离级别是通过锁的机制实现的,事务的隔离级别是数据库开发商根据业务逻辑的实际需要定义的一组锁的使用策略。当我们将数据库的隔离级别定义为某一级别后如仍不能满足要求,我们可以自定义 sql 的锁来覆盖事务隔离级别默认的锁机制。

    spring事务实际使用AOP拦截注解方法,然后使用动态代理处理事务方法,捕获处理过程中的异常,spring事务其实是把异常交给spring处理;

    spring事务只有捕获到异常才会终止或回滚,如果你在程序中try/catch后自己处理异常而没有throw,那么事务将不会终止或回滚,失去事务本来的作用;

    spring事务会捕获所有的异常,但只会回滚数据库相关的操作,并且只有在声明了rollbackForClassName="Exception"之类的配置才会回滚;

    spring事务会回滚同一事务中的所有数据库操作,本质上是回滚同一数据库连接上的数据库操作;

     

    spring事务总结:

    spring事务本质上使用数据库锁;

    spring事务只有在方法执行过程中出现异常才会回滚,并且只回滚数据库相关的操作;

     

    对象锁和spring事务的对比:

    对象锁可以保证数据一致性和业务逻辑正确性,但不能保证并发性;

    spring事务不能严格保证数据一致性和业务逻辑正确性,但具有较好的并发性,因为只锁数据库行数据;

     

    建议:

    如果只有insert操作,可以使用事务;

    如果涉及update操作但不涉及其他业务逻辑,可以保守使用事务;

    如果涉及update操作及其他业务逻辑,慎用事务,

    并且数据库查询跟数据库更新之间尽量间隔较短,中间不宜插入太多其他逻辑,减少数据一致性的风险;

    对数据一致性要求不高的情况下可以使用事务结合乐观锁,否则建议用锁;

     

    spring事务为什么不能保证数据一致性和业务逻辑正确性:

    1.如果事务方法抛异常,此时会回滚数据库操作,但已经执行的其他方法不会回滚,因此无法保证业务逻辑正确性;

    2.即使事务方法不抛异常,也不能保证数据一致性(因为事务接口里的数据库操作在整个接口逻辑执行结束后才提交到数据 库,在接口最后提交到数据库的前后很有可能带来数据一致性的问题),从而不能保证业务逻辑正确性;

     

    Spring 事务的传播属性

    所谓spring事务的传播属性,就是定义在存在多个事务同时存在的时候,spring应该如何处理这些事务的行为。这些属性在TransactionDefinition中定义,具体常量的解释见下表:

    常量名称常量解释
    PROPAGATION_REQUIRED支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是 Spring 默认的事务的传播。
    PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起。新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作
    PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
    PROPAGATION_MANDATORY支持当前事务,如果当前没有事务,就抛出异常。
    PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
    PROPAGATION_NESTED

    如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。

    数据库隔离级别

     

    隔离级别隔离级别的值导致的问题
    Read-Uncommitted0导致脏读
    Read-Committed1避免脏读,允许不可重复读和幻读
    Repeatable-Read2避免脏读,不可重复读,允许幻读
    Serializable3串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读。执行效率慢,使用时慎重

    Spring中的隔离级别

     

    常量解释
    ISOLATION_DEFAULT这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与 JDBC 的隔离级别相对应。
    ISOLATION_READ_UNCOMMITTED这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
    ISOLATION_READ_COMMITTED保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
    ISOLATION_REPEATABLE_READ这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
    ISOLATION_SERIALIZABLE这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。

    事务管理:

    <!-- 配置事务管理 -->
    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	<property name="dataSource" ref="dataSource" />
    </bean>

    Spring-mybatis 事务声明方式

    xml配置声明方式:

    <!-- 声明式事务管理 -->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <!-- 声明式事务管理 -->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    	<tx:attributes>
    		<tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/>
    		<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
    		<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
    		<tx:method name="modify*" propagation="REQUIRED" rollback-for="Exception"/>
    		<tx:method name="edit*" propagation="REQUIRED" rollback-for="Exception"/>
    		<tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/>
    		<tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/>
    		<tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/>
    		<tx:method name="remove*" propagation="REQUIRED" rollback-for="Exception" />
    		<tx:method name="testTransaction*" propagation="REQUIRED" rollback-for="Exception" read-only="true"/>
    	</tx:attributes>
    </tx:advice>

    事务切入切面:

    <!-- 配置切面 -->
    <aop:config>
    	<aop:pointcut id="transactionPointcut" expression="execution(* com.youx.qd.app.*.dservice.*.*(..))" />
    	<aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />
    </aop:config>

    测试事务方法:

    @Override
    //@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.SERIALIZABLE,rollbackFor = Exception.class)
    public ResponseDto testTransactionA() {
        System.out.println("开始事务A");
        iTb****Service.update****(1559540272306292637L,2);
        try {
            Thread.sleep(10000L);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("结束事务A");
    
        return null;
    }

    测试结果:表示在事务控制中该操作只允许读取操作

    Spring的事务管理器

    Spring并不直接管理事务,而是提供了多种事务管理器,它们将事务管理的职责委托给JTA或其他持久化机制所提供的平台相关的事务实现。每个事务管理器都会充当某一特定平台的事务实现的门面,这使得用户在Spring中使用事务时,几乎不用关注实际的事务实现是什么。

    Spring提供了许多内置事务管理器实现:

    • DataSourceTransactionManager位于org.springframework.jdbc.datasource包中,数据源事务管理器,提供对单个javax.sql.DataSource事务管理,用于Spring JDBC抽象框架、iBATIS或MyBatis框架的事务管理;
    • JdoTransactionManager位于org.springframework.orm.jdo包中,提供对单个javax.jdo.PersistenceManagerFactory事务管理,用于集成JDO框架时的事务管理;
    • JpaTransactionManager位于org.springframework.orm.jpa包中,提供对单个javax.persistence.EntityManagerFactory事务支持,用于集成JPA实现框架时的事务管理;
    • HibernateTransactionManager位于org.springframework.orm.hibernate3包中,提供对单个org.hibernate.SessionFactory事务支持,用于集成Hibernate框架时的事务管理;该事务管理器只支持Hibernate3+版本,且Spring3.0+版本只支持Hibernate 3.2+版本;
    • JtaTransactionManager位于org.springframework.transaction.jta包中,提供对分布式事务管理的支持,并将事务管理委托给Java EE应用服务器事务管理器;
    • OC4JjtaTransactionManager位于org.springframework.transaction.jta包中,Spring提供的对OC4J10.1.3+应用服务器事务管理器的适配器,此适配器用于对应用服务器提供的高级事务的支持;
    • WebSphereUowTransactionManager位于org.springframework.transaction.jta包中,Spring提供的对WebSphere 6.0+应用服务器事务管理器的适配器,此适配器用于对应用服务器提供的高级事务的支持;
    • WebLogicJtaTransactionManager位于org.springframework.transaction.jta包中,Spring提供的对WebLogic 8.1+应用服务器事务管理器的适配器,此适配器用于对应用服务器提供的高级事务的支持。

    声明事务配置分享

    spring中PROPAGATION类的事务属性详解

    1. PROPAGATION_REQUIRED:         支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 

    2. PROPAGATION_SUPPORTS:         支持当前事务,如果当前没有事务,就以非事务方式执行。 

    3. PROPAGATION_MANDATORY:      支持当前事务,如果当前没有事务,就抛出异常。 

    4. PROPAGATION_REQUIRES_NEW:   新建事务,如果当前存在事务,把当前事务挂起。

    5.  PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 

    6. PROPAGATION_NEVER:               以非事务方式执行,如果当前存在事务,则抛出异常。 

    7. PROPAGATION_NESTED:              支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

     

    如何在Spring配置文件中定义事务管理器:

    声明对本地事务的支持:

    a)JDBC及iBATIS、MyBatis框架事务管理器

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    通过dataSource属性指定需要事务管理的单个javax.sql.DataSource对象。在幕后DataSourceTransactionManager通过调用java.sql.Connection来管理事务,而后者是通过DataSource获取到的。通过调用连接的commit()方法来提交事务。同样,事务失败时通过调用rollback()方法进行回滚。

    参考文档:https://www.jianshu.com/p/6b275553b54f

    b)Jdo事务管理器

    <bean id="txManager" class="org.springframework.orm.jdo.JdoTransactionManager">
        <property name="persistenceManagerFactory" ref="persistenceManagerFactory"/>
    </bean>

    通过persistenceManagerFactory属性指定需要事务管理的javax.jdo.PersistenceManagerFactory对象。

    c)Jpa事务管理器

    <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    通过entityManagerFactory属性指定需要事务管理的javax.persistence.EntityManagerFactory对象。

    还需要为entityManagerFactory对象指定jpaDialect属性,该属性所对应的对象指定了如何获取连接对象、开启事务、关闭事务等事务管理相关的行为。

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            ……
            <property name="jpaDialect" ref="jpaDialect"/>
    </bean>
    <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>

    d)Hibernate事务管理器

    <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    在幕后HibernateTransactionManager将事务管理的职责委托给org.hibernate.Transaction对象,而后者是从Hibernate Session中获取到的。当事务成功完成时,HibernateTransactionManager将会调用Transaction对象的commit()方法来提交事务。同样,事务失败时通过调用Transaction的rollback()方法进行回滚。

    Spring对全局事务的支持:

    a)Jta事务管理器

    <beans xmlns="http://www.springframework.org/schema/beans"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:jee="http://www.springframework.org/schema/jee"
        xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/jee
           http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
     
      <jee:jndi-lookup id="dataSource" jndi-name="jdbc/test"/>
      <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManagerName" value=" java:comp/TransactionManager"/>
      </bean>
    </beans>
    “dataSource”Bean表示从JNDI中获取的数据源,而txManager是JTA事务管理器,其中属性transactionManagerName指定了JTA事务管理器的JNDI名字,从而将事务管理委托给该事务管理器。
    

    <tx:method/> 有关的设置 

    展开全文
  • 数据库事务隔离级别总结

    万次阅读 多人点赞 2019-06-07 12:23:03
    学习数据库的时候常常会接触到事务, ACID等概念,那么到底什么是数据库的事务,数据库事务又具有哪些特点,和ACID有怎样的关系,事务的隔离级别又是做什么的呢?。 事务及其四大特性? 事务(Transaction):访问并...
  • 数据库事务隔离性以及隔离性级别

    千次阅读 2018-09-05 15:56:39
    一致性(consistency):隔离执行事务时(换言之,在没有其他事务并发执行的情况下)保持数据库的一致性。 隔离性(isolation):尽管多个事务可能并发执行,但系统保证,对于任何一对事务Ti和Tj...
  • PG数据库事务隔离级别

    千次阅读 2017-01-28 14:33:19
    Postgres数据库事务隔离级别介绍
  • 项目中,以 Spring 事务为准,因为他重写了数据库隔离级别,但没有直接修改数据库隔离级别
  • 上面我们只是简单的使用事务,这里将讨论Spring事务机制中最重要的两个配置项,即隔离级别与传播行为。毫无疑问本节内容是本章的核心内容,也是互联网企业最关注的内容之一,因此他十分重要,值得花费大的篇幅去讨论...
  • 前言 ...我们都知道事务的几种性质,数据库中的一致性和隔离性等是实现事务的基本思想,在系统有大量的并发访问的情况下,了解和熟练应用数据库的本身的事务隔离级别,对于写出健壮性,并发处理能力强
  • 数据库事务隔离性实战例子

    千次阅读 2018-09-05 14:31:40
    接着上回数据库事务隔离性实战的章节继续操作,主要针对几个只要问题进行操作和复现: 脏读:一个事务中,一开始读取的数据就为脏数据 不可重复读:一个事务中,一开始读取的数据,再次读取时数据发生了改变 幻读...
  • 数据库事务隔离级别.docx数据库事务隔离级别.docx数据库事务隔离级别.docx
  • 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。数据库事务的隔离级别有4个,下面话不多说了,来一起看看详细的介绍吧。 数据库事务有四种隔离级别: 未提交读(Read Uncommitted):允许脏...
  • 数据库事务隔离的四个级别

    千次阅读 2020-11-02 09:51:57
    **数据库隔离级别:**是在在数据库操作中,为了有效保证并发读取数据的正确性提出的。 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的...
  • 数据库事务隔离级别的理解

    千次阅读 2019-03-09 10:36:10
    数据库事务隔离级别的理解 1.事务的概念 ​ 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。 2. MySQL数据库事务操作命令 ​ 直接通过例子来说明 1.事务开始但没有提交 ...
  • 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. 2 [mysqld] 3 transactio
  • 本文实例讲述了PostgreSQL数据库事务实现方法。分享给大家供大家参考,具体如下: 事务简介 事务管理器:有限状态机 日志管理器 CLOG:事务的执行结果 XLOG:undo/redo日志 锁管理器:实现并发控制,读阶段采用...
  • 数据库隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏写、脏读、不可重复读、幻读这几类问题。 √: 可能出现...
  • 数据库事务隔离级别和锁实现机制

    千次阅读 2016-11-05 15:29:24
    数据库事务处理中出现的数据不一致的情况  在多个事务并发做数据库操作的时候,如果没有有效的避免机制,就会出现种种问题。大体上有四种问题,归结如下: 1、丢失更新  如果两个事务都要更新数据库一...
  • 数据库事务隔离级别及其应用

    千次阅读 2017-11-08 17:37:49
    数据库事务隔离级别及其应用  一、数据库事务  事务(Transaction):是并发控制的单元,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,sql server 能将逻辑相关...
  • 关于达梦数据库事务隔离级别介绍达梦与Oracle支持的隔离级别脏读不可重复读幻读隔离级别的实现读提交隔离级串行化隔离级读未提交隔离级只读事务 达梦与Oracle支持的隔离级别 达梦 Oracle 读未提交 无 读...
  • 事务隔离级别

    万次阅读 多人点赞 2019-05-20 20:22:47
    事务隔离级别 事务的四大特性分别是:原子性、一致性、隔离性、持久性 ...以MYSQL数据库来分析四种隔离级别 第一种隔离级别:Read uncommitted(读未提交) 如果一个事务已经开始写数据,则另外一个事...
  • 数据库事务实现原理

    千次阅读 2020-03-07 22:05:32
    数据库事务 1. 定义 数据库事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。 2. 典型特性 典型特性有原子性...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 177,812
精华内容 71,124
关键字:

数据库事务的隔离是怎么实现的