事务隔离级别

Java原理 事务的ACID是指什么?

拥有回忆 提交于 2020-03-02 16:41:42
Java原理 事务的ACID是指什么? 一、什么是Java事务 通常的观念认为,事务仅与数据库相关。 事务必须服从ISO/IEC所制定的ACID原则。 ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。 原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。 一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。 隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。 持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简单的说就是:要么全部执行成功,要么撤销不执行。 既然事务的概念从数据库而来,那Java事务是什么?之间有什么联系? 实际上,一个Java应用系统,如果要操作数据库,则通过JDBC来实现的。增加、修改、删除都是通过相应方法间接来实现的,事务的控制也相应转移到Java程序代码中。因此,数据库操作的事务习惯上就称为Java事务。 二、为什么需要事务 事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。 举一个简单例子:比如银行转帐业务

深入理解MySQL底层实现

自古美人都是妖i 提交于 2020-03-02 13:01:12
本文摘自: http://harlon.org/2018/06/20/database/ 深入理解MySQL底层实现 这里选用MySQL作为了解数据库的底层实现,这是因为MySQL是目前最常用的数据库,了解它的底层实现也基本上对目前大数据的数据库所用的技术会有一个大致的了解。数据库最主要的索引设计,了解数据库的索引设计基本上就对数据库有了大致的了解,其次对其事务的ACID操作实现原理做以分析,以及数据库中所用到的提高其性能的优化等等。 存储引擎 MySQL常用的存储引擎有InnoDB和MyISAM,其中MyISAM是MySQL的默认存储引擎。 InnoDB InnoDB的存储文件有两个,后缀名分别是.frm和.idb,其中.frm是表的定义文件,而idb是数据文件。InnoDB中存在表锁和行锁,不过行锁是命中索引的情况下才会起作用的。 InnoDB支持事务,且支持四种隔离级别,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏

Spring声明式事务@Transactional 详解,事务隔离级别和传播行为

风流意气都作罢 提交于 2020-03-02 09:42:20
@Transactional注解支持9个属性的设置,这里只讲解其中使用较多的三个属性:readOnly、propagation、isolation。其中propagation属性用来枚举事务的传播行为,isolation用来设置事务隔离级别,readOnly进行读写事务控制。 @Service @Transactional(readOnly = true) public class AppTradeRec2Service extends BaseService { @Autowired private AppTradeRecDao appTradeRecDao; @Autowired private ConsInfoDao consInfoDao; @Transactional(readOnly = false) public void payCharge(TradeRec tradeRec) { User usr = UserUtils.getUser(); ConsInfo cons = consInfoDao.getByUser(usr.getId()); //修改交易记录 tradeRec.setPayBefore(cons.getAccountAmt()); tradeRec.setPayAfter(cons.getAccountAmt() - tradeRec

MySQL REPEATABLE-READ && 幻读

坚强是说给别人听的谎言 提交于 2020-03-02 04:57:45
MySQL REPEATABLE-READ && 幻读 关于mysql命令行中事务控制的语句见该文章 http://my.oschina.net/xinxingegeya/blog/296459 关于MVCC多版本控制 http://my.oschina.net/xinxingegeya/blog/208821 表结构 create table t1( a int primary key, b int not null ) REPEATABLE-READ可重复读(一) 这里打开两个mysql的命令行窗口,窗口A,即session1,窗口B,即session2。 session1 mysql> begin ; Query OK, 0 rows affected (0.00 sec) mysql> select * from t1; +----+------+ | a | b | +----+------+ | 51 | 3000 | | 52 | 3000 | | 53 | 3000 | | 54 | 3000 | +----+------+ 4 rows in set (0.00 sec) 以上sql只是显示的开启了事务,执行了sql查询。下面看session2的操作。 要注意这里的select操作是一般的快照读。根据MVCC多版本控制规则读取的数据行。 session2

MyBatis配置文件(七)--environments运行环境

大兔子大兔子 提交于 2020-03-01 12:26:02
一、environments配置信息: environments的作用是用来配置数据库信息,可以配置多个,其有两个可配的子元素,分别是:事务管理器transactionManager和数据源dataSource,先看一下我配置的例子: 1 <!-- 环境模式:development开发模式 work工作模式 --> 2 <environments default="development"> 3 <!--环境变量 --> 4 <environment id="development"> 5 <!--事务管理器 --> 6 <transactionManager type="JDBC" /> 7 <!--数据源 --> 8 <dataSource type="POOLED"> 9 <property name="driver" value="${db.driver}" /> 10 <property name="url" value="${db.url}" /> 11 <property name="username" value="${db.username}" /> 12 <property name="password" value="${db.pwd}" /> 13 </dataSource> 14 </environment> 15 </environments>

Mybatis事务管理

陌路散爱 提交于 2020-03-01 10:36:14
一、Mybatis事务 1、事务管理方式 Mybatis中的事务管理方式有两种: 1、JDBC的事务管理机制,即使用JDBC事务管理机制进行事务管理 2、MANAGED的事务管理机制,Mybatis没有实现对事务的管理,而是通过容器来实现对事务的管理 其中,Mybatis提供了事务的接口:Transaction,其代码如下: public interface Transaction { /** * Retrieve inner database connection * @return DataBase connection * @throws SQLException */ //获得数据库连接 Connection getConnection() throws SQLException; /** * Commit inner database connection. * @throws SQLException */ //提交 void commit() throws SQLException; /** * Rollback inner database connection. * @throws SQLException */ //回滚 void rollback() throws SQLException; /** * Close inner database

数据库事务概览

丶灬走出姿态 提交于 2020-03-01 09:40:20
事务种类 隐式事务 如单条 sql 语句的执行 显式事务 如多条 sql 语句的执行,一般谈论数据库事务时,指的是数据库的显式事务 事务特性 数据库事务具有 ACID 这4个特性 A —— Atomic /əˈtɒmɪk/ 原子性。所有 sql 作为一个原子工作单元执行,要么全部执行,要么全部不执行。这里应该是借用了化学学科的术语概念:原子虽然在物理状态中可以继续细分(原子由原子核和核外电子组成),但原子在化学反应中是不可再分。 C —— Consistent /kənˈsɪstənt/ 一致性。事务完成后,所有数据的状态都是一致的,比如我转账给你100,那么我的账户减去了100,你的账户则必定加上了100。 I —— Isolation /ˌaɪsəˈleɪʃn/ 隔离性。每个事务做的操作必须与其它事务隔离,即便有多个事务并发执行。一个事务处理时的中间状态对其它事务是不可见的。 D —— Duration /duˈreɪʃn/ 持久性。事务完成后,相关的对数据库数据的修改被持久化存储。 数据不一致问题 多个并发执行的事务,如果操作时涉及同一条记录数据,可能会发生问题,即并发操作可能导致数据的不一致问题,这些问题包含以下3种情形: 脏读(Dirty Read) 读取未提交数据 执行时间 事务A 事务B 1 事务开启 2 事务开启 修改一条记录record(假使原来数据是纯粹干净的

事务与连接池

泪湿孤枕 提交于 2020-03-01 06:04:45
事务的概念:   事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。 数据库开启事务的命令为:   start transaction 开启事务。   rollback 回滚事务。   commit 提交事务。 数据库中默认的事务开启状态:   MySQL中事务默认自动提交的,每当执行一条SQL,就会提交一个事务 (一条SQL 就是一个事务);Oracle 中事务默认不自动提交,需要在执行SQL 语句后 通过commint 手动提交事务。 数据库中存在一个设置自动提交的变量 ,通过 show variables like '%commit%';   得到结果:autocommint = on,说明自动提交被开启。   关闭自动提交: set autocommit = off 或 set autocommit = 0   如果设置autocommit = off,则之后每条SQL 都会处于一个事务中,相当于每条SQL执行前 都执行 start transaction,必须执行commit才会对数据库执行修改。( Oracle中 autocommit 默认值为 off。) 在jdbc中使用事务:   Connection.setAutoCommit(false);   Connection.rollback();   Connection.commit();

MySQL存储过程之事务管理

浪尽此生 提交于 2020-03-01 06:01:17
ACID:Atomic、Consistent、Isolated、Durable 存储程序提供了一个绝佳的机制来定义、封装和管理事务。 1,MySQL的事务支持 MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: MyISAM:不支持事务,用于只读程序提高性能 InnoDB:支持ACID事务、行级锁、并发 Berkeley DB:支持事务 隔离级别: 隔离级别决定了一个session中的事务可能对另一个session的影响、并发session对数据库的操作、一个session中所见数据的一致性 ANSI标准定义了4个隔离级别,MySQL的InnoDB都支持: READ UNCOMMITTED:最低级别的隔离,通常又称为dirty read,它允许一个事务读取还没commit的数据,这样可能会提高性能,但是dirty read可能不是我们想要的 READ COMMITTED:在一个事务中只允许已经commit的记录可见,如果session中select还在查询中,另一session此时insert一条记录,则新添加的数据不可见 REPEATABLE READ:在一个事务开始后,其他session对数据库的修改在本事务中不可见,直到本事务commit或rollback。在一个事务中重复select的结果一样,除非本事务中update数据库。 SERIALIZABLE

MySQL中InnoDB锁的介绍及用途

巧了我就是萌 提交于 2020-03-01 03:45:53
前言 读这篇文章之前可以先了解一下 MySQL中InnoDB数据结构 一、InnoDB引擎对隔离级别的支持 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 可能 可能 可能 不可重复读(read-committed) 不可能 可能 可能 可重复读(repeatable-read) 不可能 不可能 InnoDB不可能 串行化(serializable) 不可能 不可能 不可能 隔离级别到底如何实现? 二、锁的介绍 1、表锁、行锁 通过锁来管理不同事务对共享资源的并发访问 表锁与行锁的区别: 锁定粒度:表锁 > 行锁 加锁效率:表锁 > 行锁 冲突概率:表锁 > 行锁 并发性能:表锁 < 行锁 InnoDB存储引擎只支持行锁,表锁是通过锁住所有行实现 2、InnoDB锁类型 共享锁(行锁,又称S锁):Shared Locks 又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁, 都能访问到数据,但是只能读不能修改。 select * from teachers WHERE id = 1 LOCK IN SHARE MODE ; commit / rollback 排它锁(行锁,又称X锁):Exclusive Locks 又称为写锁,简称X锁,排他锁不能与其他锁并存,如一个事务获取了一个数据行的排他 锁