数据库事务

Spring注解方式管理事务以及事务传播行为Propagation(视频笔记23)

大憨熊 提交于 2020-01-29 12:19:05
使用@Transactional注解声明Bean底下所有业务方法需要事务管理。 1.默认一个业务方法开启和结束事务,什么时候提交,什么时候回滚呢? Spring容器默认情况下对于运行期异常(unchecked Exception)会进行事务回滚,如果是用户违例(checked Exception),事务不会回滚。 运行期违例:throw new RuntimeException("XXX");运行期违例不需要使用try/catch捕捉,编译可以通过 用户违例,throw new Exception("XXX");必须使用try/catch捕捉,否则编译不能通过。 也可以修改这种行为,在业务方法上加上@Transactional(rollbackFor=Exception.class),则cheked Exception也会回滚。 如果@Transactional(noRollbackFor=RuntimeException.class),则运行期例外也不会回滚。 2.有些业务方法不需要业务管理,如获取数据的。开启事务会对性能有影响。所以使用 @Transactional(propagation=Propagation.NOT_SUPPORTED) propagation属性指定事务的传播行为。则Spring容器在该业务方法前不会开启事务。 事务的传播属性 : (1

何为脏读、不可重复读、幻读

痞子三分冷 提交于 2020-01-29 11:10:31
1.0、前言 事务的隔离性是指多个事务并发执行的时候相互之间不受到彼此的干扰的特性,隔离性是事务ACID特性中的I,根据隔离程度从低到高分为Read Uncommitted(读未提交),Read Committed(读已提交),Repeatable Read(可重复读),Serializable(串行化)四种隔离级别。在具体介绍事务隔离性前先介绍几个名词,以便说明数据库在并发操作时候可能存在的问题,以便展开来探讨这四种隔离级别对应存在哪些问题,哪些隔离级别解决了哪些问题。 1.1 何为脏读、不可重复读、幻读 脏读 所谓脏读是指一个事务中访问到了另外一个事务未提交的数据,如下图: image.png 如上图开启两个会话来模拟两个线程同时去访问数据库表table中id=1的记录,假设两个会话开启前数据库中table表中id=1的记录行里面的列age值为5。会话1和2一开始都开启了显示的事务(只有执行commit命令才会提交数据的修改),会话2首先更新了table中id=1的记录行的age列的值为10(更新前值为5),在会话2执行commit提交前,会话1通过select语句查询id=1的记录行中age列的值,这时候如果存在脏读,则会话1读取到的age的值是10而不是5了,虽然会话2的更新还没有提交。那么脏读存在什么问题那?如果会话2最后提交了

MySQL事务处理特性和隔离级别

喜欢而已 提交于 2020-01-29 05:33:26
一.事务的特性 1.原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 2.一致性(Consistency):在一个事务中,事务前后数据的完整性必须保持一致,可以想象银行转账、火车购票。 3.隔离性(Isolation):多个事务,事务的隔离性是指多个用户并发访问数据库时, 一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。 4.持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。 二.事务的隔离级别 上面介绍了3种事务并发问题!现在介绍一下数据库提供的解决方案! 1.read uncommitted : 读取尚未提交的数据 :这个最低级,但是效率肯定最高,但是哪一个问题都不能解决。 2.read committed:读取已经提交的数据 :可以解决脏读 。 3.repeatable read:重读读取:可以解决脏读 和 不可重复读 。 4.serializable:串行化:可以解决脏读不可重复读和虚读,效率最差,相当于锁表,开发中一般不用。 上面的“2”是oracle数据库默认设置,“3”是mysql数据库默认的设置。 总结一下 事务隔离级别的性能: read uncommitted>read

@Transactional注解

喜欢而已 提交于 2020-01-29 05:09:05
@Transactional注解 一.事物传播行为介绍: @Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)   @Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不为这个方法开启事务   @Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务   @Transactional(propagation=Propagation.MANDATORY) :必须在一个已有的事务中执行,否则抛出异常   @Transactional(propagation=Propagation.NEVER) :必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)   @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务. 二.事物超时设置: @Transactional(timeout=30) /

Redis事务与可分布式锁

♀尐吖头ヾ 提交于 2020-01-28 23:39:13
1 Redis 事务 1.1 Redis 事务介绍 l Redis 的事务是通过 MULTI , EXEC , DISCARD 和 WATCH 这四个命令来完成的。 l Redis 的单个命令都是 原子性 的,所以这里确保事务性的对象是 命令集合 。 l Redis 将命令集合序列化并确保处于同一事务的 命令集合连续且不被打断 的执行 l Redis 不支持回滚操作 1.2 相关命令 l MULTI 用于标记事务块的开始 。 Redis 会将后续的命令逐个放入队列中,然后使用 EXEC 命令 原子化地执行这个命令序列。 语法: multi l EXEC 在一个事务中执行所有先前放入队列的命令 ,然后恢复正常的连接状态 语法: exec l DISCARD 清除所有先前在一个事务中放入队列的命令 ,然后恢复正常的连接状态。 语法: discard l WATCH 当某个 事务需要按条件执行 时,就要使用这个命令将给定的 键设置为受监控 的状态。 语法: watch key [key…] 注意事项: 使用该命令可以实现 redis 的 乐观锁 。 l UNWATCH 清除所有先前为一个事务监控的键。 语法: unwatch 1.3 事务失败处理 l Redis 语法错误(可以理解为 编译期错误 ) l Redis 类型错误(可以理解为 运行期错误 ) l Redis 不支持事务回滚

Spring 事务管理的使用

一曲冷凌霜 提交于 2020-01-28 22:11:59
Spring提供了2种事务管理 编程式的 声明式的(重点):包括xml方式、注解方式(推荐) 基于转账的demo dao层 新建包com.chy.dao,包下新建接口AccountDao、实现类AccountDaoImpl: public interface AccountDao { //查询用户账户上的余额 public double queryMoney(int id); //减少用户账户上的余额 public void reduceMoney(int id, double amount); //增加用户账户上的余额 public void addMoney(int id, double amount); } @Repository public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao { @Override public double queryMoney(int id) { String sql = "select money from account_tb where id=?"; JdbcTemplate jdbcTemplate = super.getJdbcTemplate(); double money = jdbcTemplate.queryForObject(sql,

mysql 的事务

£可爱£侵袭症+ 提交于 2020-01-28 21:04:19
mysql 的事务管理 一、事务的基础介绍 概念: 事务Transactions:一组原子性的SQL语句,或一个独立工作单元 事务日志:记录事务信息,实现undo,redo等故障恢复功能 事务的ACID特性 A:atomicity原子性;整个事务中的所有操作要么全部成功执行,要么全部 失败后回滚 C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性 状态 I:Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务 所见;隔离有多种隔离级别,实现并发 D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中 二、事务的管理 启动事务: BEGIN BEGIN WORK START TRANSACTION 结束事务: COMMIT:提交 ROLLBACK: 回滚 注意:只有事务型存储引擎中的DML语句方能支持此类操作 自动提交:set autocommit={1|0} 默认为1,为0时设为非自动提交 建议:显式请求和提交事务,而不要使用“自动提交”功能 事务支持保存点:savepoint 类似快照的作用,但是事务一提交就失效了 设置事务保存点 SAVEPOINT identifier MariaDB [ hellodb ] > savepoint b5 ; Query OK , 0 rows affected ( 0

hibernate整理

泪湿孤枕 提交于 2020-01-28 17:19:24
国外框架项目地址:http://websystique.com/springmvc/spring-mvc-4-angularjs-example/Angularjs文本输入框用ng-moduel,其他的用{{ }}放行用.*?Angularjs插件地址http://www.cnblogs.com/pilixiami/p/5634405.htmlUI班的教程:http://pan.baidu.com/share/link?shareid=4146906997&uk=866705889非严格读写是并发的概念Spring不支持多线程Flush()强制要求缓存与数据库一致Eache表连接,lazy子查询ORM: 编写程序时,以面向对象的方式处理数据 保存数据时是以关系型数据库的方式存储的Hibernate的数据持久化: New实例化对象时默认是瞬时的 Jdbc连接数据库时,持久化数据 将数据存入硬盘单向关联关系: 一个类单方向包含另一个类为属性,模拟数据库外键mysql数据库附加:String driver=com.mysql.jdbc.DriverString url=jdbc:mysql://localhost:3306/demohibernate注入: 实体类(1)这个表示一个实体类,Table表示对应数据库中的表名。@Entity@Table(name="t_emp")(2

jdbc事务提交

筅森魡賤 提交于 2020-01-28 16:25:47
当Jdbc程序向 数据库 获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,并且保证这些语句是在同一时间共同执行的时,我们就应该为这多条语句定义一个事务。 其中,银行转账这一事例,最能说明,使用事务的重要性了。 update from account set money=money-100where name=‘a’; update from account set money=money+100 wherename=‘b’; 因为这时,两个账户的增减变化是在一起执行的。现实生活中这种类似于同步通信的例子还有很多,这里,不再赘述。 当然,对于事务的编写,也是要遵守一定的顺序的: 首先,.设置事务的提交方式为非自动提交: conn.setAutoCommit(false); 接下来,.将需要添加事务的代码放入try,catch块中。 然后,.在try块内添加事务的提交操作,表示操作无异常,提交事务。 conn.commit(); 尤其不要忘记,.在catch块内添加回滚事务,表示操作出现异常,撤销事务: conn.rollback(); 最后,设置事务提交方式为自动提交: conn.setAutoCommit(true); 这样,通过简单的几步

MySQL 事务

时间秒杀一切 提交于 2020-01-28 16:05:34
银行引用是事务的一个经典例子:假如银行有两张表,一张支票表,一张储蓄表,现在需要从Jones用户的支票账户转移200¥ 至储蓄账户,那么至少需要三步: 1. 检查Jones的支票账户余额是否大于200¥ 2. Jones的支票账户-200¥ 3. Jones的储蓄账户+200¥ 上述三步可组成一个事务,当2、3步故障时,之前执行的操作会自动回滚,保证数据的一致性。 一、MySQL事务 MySQL事务是一组SQL语句或一个独立运行的工作单元并且满足ACID测试。 ACID测试: A.atomicity,原子性,一个事务必须作为不可分割的最小单元,事务中的语句要么都执行成功,要么都执行失败。 C.consistency,一致性,数据库总是从一个一致性状态到另一个一致性状态(数据库的结果是一致的,所有事务中SQL语句共同修改后的结果)不可能因为系统奔溃出现上述支票表-200¥而储蓄表未+200¥,未提交的事务并不会保存至数据库中。 I. isolation ,隔离性,当前事务操作过程对于另一个线程事务的可见度,由隔离级别决定。 D. durability , 持久性 , 所有事务提交后都永久存放于数据库中。 隔离级别: 1. READ UNCOMMITTED (读未提交) 2. READ COMMITTED(读提交) 3. REPEATEABLE READ(可重复读) 4.