事务

Java EE入门(五)——MySQL基础 (多表关系、范式、多表查询、事务、DCL)

元气小坏坏 提交于 2020-02-19 12:13:21
Java EE入门(五)——MySQL基础 (多表关系、范式、多表查询、事务、DCL)   iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1、多表关系 多表之间的关系: 一对一的关系。 一对多 或 多对一 的关系。 多对多的关系。 一对多关系实现:在多的一方建立外键列,指向一的一方的主键。 多对多关系实现:需要借助第三张中间表,中间表中至少包含两个字段,作为外键分别指向两张表的主键。这两个字段构成了联合主键。 一对一关系实现:在任意一方添加外键列,指向另一方的主键。而且需要在外键列添加唯一约束。 分析示例:用户收藏旅游线路。 三个实体:旅游线路分类、旅游线路、用户。 旅游线路分类和旅游线路是 一对多 的关系。 用户和收藏的旅游线路是 多对多 的关系。 实现: CREATE TABLE category( cid INT PRIMARY KEY AUTO_INCREMENT, cname VARCHAR(100) NOT NULL UNIQUE ); CREATE TABLE route( rid INT PRIMARY KEY AUTO_INCREMENT, rname VARCHAR(100) NOT NULL UNIQUE, CONSTRAINT r_c FOREIGN KEY (rid) REFERENCES category

JDBC总结——事务

本秂侑毒 提交于 2020-02-19 05:24:16
文章目录 事务 一、事务的基本介绍 1、概念 2、操作 3、操作实例 4、MySQL数据库中默认自动提交 二、事务的四大特征 三、事务的隔离级别 1、概念 2、存在的问题 3、隔离级别 四、Jdbc事务控制 1、概述 2、控制事务的API: 3、核心代码 事务 一、事务的基本介绍 1、概念 如果包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。 2、操作 ① 开启事务: start transaction; ② 回滚: rollback; ③ 提交: commit; 3、操作实例 account.sql -- 创建account表 CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT ; NAME VARCHAR ( 10 ) , balance DOUBLE ) ; -- 添加数据 INSERT INTO account ( NAME , balance ) VALUES ( 'zhangsan' , 1000 ) , ( 'lisi' , 1000 ) ; SELECT * FROM account ; UPDATE account SET balance = 1000 ; --张三给李四转账500元 --0.开启事务 START TRANSACTION ; --1.张三账户-500

10.spring声明式事务

时光毁灭记忆、已成空白 提交于 2020-02-19 00:27:00
一.回顾事务 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎! 事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性。 1.事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用。 2.事务四个属性ACID 原子性(atomicity) 事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用 一致性(consistency) 一旦所有事务动作完成,事务就要被提交。数据和资源处于一种满足业务规则的一致性状态中 隔离性(isolation) 可能多个事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏 持久性(durability) 事务一旦完成,无论系统发生什么错误,结果都不会受到影响。通常情况下,事务的结果被写到持久化存储器中 二.Spring中的事务管理 1.测试事务的一致性 步骤:(在上一个的博客项目的基础上) 在UserMapper接口中添加两个方法 addUser:添加用户 deleteUser:删除用户 在UserMapper.xml中编写SQL语句,故意将delete写成deletes导致出错 修改UserMapperImpl类 添加addUser方法 添加deleteUser方法 修改selectUser方法,让它先添加一个用户

MySQL数据库逐步安装

纵饮孤独 提交于 2020-02-18 22:08:37
本文以mysql数据库5.5版本为例进行说明。 安装包下载地址也可以去官网下载 提取码:l7uy 安装步骤 根据操作系统选择版本,这里使用的是mysql64位的,双击安装包,点击下一步。这一步,必须选择勾选“I accept the terms in the License Agreement”。然后点击next,继续安装。 这一步,显示3种安装类型: Typical:表示一般常用的组件都会被安装,默认情况下安装到C盘programFiles下。 Custom:自定义,可以选择安装什么功能,或者不安装什么功能,安装路径也是可以选择的; Complete:全部功能,但是会占用较多的磁盘空间。 这里选择Custom类型。点击next。 这一步,需要注意一下。mysql服务,以及server data files(数据文件服务)默认都是安装在C盘下,前者是安装在C盘programFiles,后者安装在C盘的programData(该文件夹默认情况下是隐藏的)路径下。可以分别修改两者的安装路径,注意安装路径中一定不要有中文。点击next。 此时会显示安装进度条,安装完成之后会弹出一些介绍页面,直接点击next即可。最后会显示安装完成界面。下边有一个“launch the MYSQL Instance Configuration Wizard”,勾选上,会显示mysql服务的配置页面。注意

常用分布式事务解决方案

半腔热情 提交于 2020-02-18 14:37:02
出处: https://github.com/clsaa/Distributed-Transaction-Notes 。 作者总结得很全面,做个笔记搬运。 一、 两阶段提交(2PC) 一个基于两阶段提交协议的分布式事务框架(LCN) 二阶段提交(Two-phaseCommit)是指,在计算机网络以及数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法(Algorithm)。通常,二阶段提交也被称为是一种协议(Protocol))。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。 所谓的两个阶段是指:第一阶段:准备阶段(投票阶段)和第二阶段:提交阶段(执行阶段)。 1. 准备阶段 事务协调者(事务管理器)给每个参与者(资源管理器)发送Prepare消息,每个参与者要么直接返回失败(如权限验证失败),要么在本地执行事务,写本地的redo和undo日志

mysql日志恢复数据方法。

强颜欢笑 提交于 2020-02-18 06:42:12
1. 指定恢复时间   对于MySQL 4.1.4,可以在mysqlbinlog语句中通过--start-date和--stop-date选项指定DATETIME格式的起止时间。举例说明,假设在今天上午10:00(今天是2006年4月20日),执行SQL语句来删除一个大表。要想恢复表和数据,你可以恢复前晚上的备份,并输入:    mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.123456 | mysql -u root -pmypwd      该命令将恢复截止到在--stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句,可能你想要恢复后面发生的活动。根据这些,你可以用起使日期和时间再次运行mysqlbinlog: mysqlbinlog --start-date="2005-04-20 10:01:00" /var/log/mysql/bin.123456 | mysql -u root -pmypwd      在该行中,从上午10:01登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午10:00前一秒钟。你应检查日志以确保时间确切。下一节介绍如何实现。    2. 指定恢复位置

数据库的概念

坚强是说给别人听的谎言 提交于 2020-02-18 05:55:43
1、触发器的作用? 答:触发器是一种特殊的存储过程,它主要是通过事件来触发而被执行的。它的作用是可以强化约束,维护数据的完整性和一致性,也可以可以跟踪数据库内的操作从而不允许未经许可的更新和变化。也可以联级运算。如某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。 2、什么是存储过程?如何来调用存储过程? 答:存储过程是一个预编译的SQL语句,他的优点是允许模块化的设计,也就是说只需创建一次,在该程序中就可以调用多次。例如某次操作需要执行多次SQL,就可以把这个SQL做一个存储过程,因为存储过程是预编译的,所以使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。 3、什么是内存泄漏? 答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。 4、什么是事务? 答:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。事务有四个特性,分别是:原子性,一致性,隔离性和持久性。 5

有关Java中try-catch的使用

痴心易碎 提交于 2020-02-17 23:01:26
以下皆来自转载总结,用作个人总结学习 什么时候需要用到try-catch? 代码执行预料不到的情况,或出错的可能性很大时,使用try-catch语句。 1、构造一个文件输入流,(上传文件时,线上环境的内存情况不确定)出错的可能性很大。 2、文件上传写入,数据库事务的提交,还有摄像头和打印机的使用 使用数据库事务的时候使用try-catch,如果事务执行成功就提交事务,如果事务执行失败就由catch提示错误并回滚事务。还有就是在使用curl方式访问其他网络地址的时候会用到,如果网络访问出错或者网络访问超时就在catch中抛出错误。还有就是之前写winfrom软件的时候调用摄像头和打印机,会使用try-catch。 3、程序调用其他人写的程序接口的时候,不敢保证别人的接口返回的都是约定好的返回值。 所以如果接口返回约定好的返回值,那么try中的程序正常执行,如果意料之外catch抛出错误。 可以通过下面这一段代码来加深一下理解: public class TryCatchStu { /*try catch:自己处理异常 *try{ * 可能出现异常的代码 *}catch(异常类名A e){ * 如果出现了异常类A类型的异常,那么执行该代码 *}...(catch可以有多个) *finally{ * 最终肯定必须要执行的代码(例如释放资源的代码) *} * 代码执行的顺序: *1

JAVA事务系列三:JTA事务

徘徊边缘 提交于 2020-02-17 19:39:20
什么是JTA? JTA全称Java Transaction API ,即Java事务API,英文解释: Java Transaction API (JTA) specifies standard Java interfaces between a transaction manager and the parties involved in a distributed transaction system: the resource manager, the application server, and the transactional applications. JTA是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用JTA来访问事务。 JTA允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据,这些数据可以分布在多个数据库上。JDBC驱动程序的JTA支持极大地增强了数据访问能力。 JTA的主要接口: 位于javax.transaction包中 a、UserTransaction接口:让应用程序得以控制事务的开始、挂起、提交、回滚等。由Java客户端程序或EJB调用。 b、TransactionManager 接口:用于应用服务器管理事务状态 c、Transaction接口:用于执行相关事务操作 d、XAResource接口

帐务处理最终一致性方案

£可爱£侵袭症+ 提交于 2020-02-17 19:07:13
随着交易量逐步上升,业务越来越复杂,在设计整个帐务处理中考虑最终一致性的方案。 整个方案大概流程可以分为: 在业务完成后同步记录资金变动流水 如果需要里面处理的账务,则同步发出账务处理的异步消息 通过定时任务每分钟拉去需要记账的流水记录 启动线程池对每笔流水记录进行帐务更新 在数据更新很大的情况下,由于对于处理账务信息要求非常严格,所以在整个执行过程中需要引入很多技术手段才能达到快速并且正确记账。 和业务执行一起生成最关键的资金变动流水,需要和其他业务绑定在一个事务中,由于这是账务只需要insert流水,所以是一个执行开销很小的数据库操作。通过new DefaultTransactionDefinition() 来控制事务的提交。 //获取事务 DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); TransactionStatus ts = transactionManager.getTransaction(definition); try { //依次相关业务数据再生成对应的账务流水 // step 1 更新其他相关A表数据 recordADao.update(recordA); // step 2 更新信用卡信息 amortizePaymentBiz.update