mysql事务

浅谈mysql事务

倾然丶 夕夏残阳落幕 提交于 2019-11-26 12:43:01
/*--> */ /*--> */ 1. 什么是事务?   是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元); 2.事务的四大特性ACID   一个事务往往具有一下特性:    原子性(ATOMICITY):   一个事务要被完全的无二义性的做完或撤消。在任何操作出现一个错误的情况下,构成事务的所有操作的效果必须被撤消,数据应被回滚到以前的状态。    一致性(CONSISTENCY):      一个事务应该保护所有定义在数据上的不变的属性(例如完整性约束)。在完成了一个成功的事务时,数据应处于一致的状态。换句话说,一个事务应该把系统从一个一致-状态转换到另一个一致状态。举个例子,在关系数据库的情况下, 一个一致的事务将保护定义在数据上的所有完整性约束。    隔离性(ISOLATION):   在同一个环境中可能有多个事务并发执行,而每个事务都应表现为独立执行。串行的执行一系列事务的效果应该同于并发的执行它们。这要求两件事:   在一个事务执行过程中,数据的中间的(可能不一致)状态不应该被暴露给所有的其他事务。   两个并发的事务应该不能操作同一项数据。数据库管理系统通常使用锁来实现这个特征。    持久性(DURABILITY):  

MySQL事务

好久不见. 提交于 2019-11-26 12:39:07
Db::startTrans(); try{ $order = Db::name('charge')->where('order_no', $data['out_trade_no'])->find(); if(!$order){ echo 'FAIL'; exit(); } if($order['status']==){ echo 'FAIL'; exit(); } DB::table('charge')->where('order_no', $data['out_trade_no'])->update(['status'=>1, 'update_time'=>time() Db::table('user')->where('id', $order['user_id])->setInc('money', $order['money']); $data = array( 'uid' => $order['user_id'], 'type' => 3, 'relation' => $order['id'], 'money' => $order['money'], 'info' => '会员充值' . $order['money'] . '元', 'create_time' => time(), 'create_ip' => request()->ip() ); Db::name(

【转】史上最全的select加锁分析(Mysql)

我只是一个虾纸丫 提交于 2019-11-26 12:28:46
引言 大家在面试中有没遇到面试官问你下面六句Sql的区别呢 select * from table where id = ? select * from table where id < ? select * from table where id = ? lock in share mode select * from table where id < ? lock in share mode select * from table where id = ? for update select * from table where id < ? for update 如果你能清楚的说出,这六句sql在不同的事务隔离级别下,是否加锁,加的是共享锁还是排他锁,是否存在间隙锁,那这篇文章就没有看的意义了。 之所以写这篇文章是因为目前为止网上这方面的文章太片面,都只说了一半,且大多没指明隔离级别,以及 where 后跟的是否为索引条件列。在此,我就不一一列举那些有误的文章了,大家可以自行百度一下,大多都是讲不清楚。 OK,要回答这个问题,先问自己三个问题 当前事务隔离级别是什么 id列是否存在索引 如果存在索引是聚簇索引还是非聚簇索引呢? OK,开始回答 正文 本文假定读者,看过我的 《MySQL(Innodb)索引的原理》 。如果没看过,额,你记得三句话吧 innodb一定存在聚簇索引

(二)MVC项目+c3p0连接池

拜拜、爱过 提交于 2019-11-26 12:11:15
一.项目架构 注:删除了原有的数据库工具,添加了c3p0数据库工具类,添加了c3p0的配置文件,修改了Dao类以及servlet类 二.修改或添加的类 1.C3p0Helper(暂时不了解事务回滚之类的怎么用或者有什么用,只用了连接和关闭) package helper; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3p0Helper { private static String configName = "mysql"; //如果无参,则使用c3p0-config.xml中的default-config,该处使用mysql的配置 private static DataSource ds = new ComboPooledDataSource(configName); /** * 它为null表示没有事务 * 它不为null表示有事务 * 当开启事务时,需要给它赋值 * 当结束事务时,需要给它赋值为null * 并且在开启事务时,让dao的多个方法共享这个Connection */ private static

数据库中的乐观锁与悲观锁

限于喜欢 提交于 2019-11-26 12:06:11
悲观锁 当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。 这种借助数据库锁机制在修改数据之前先锁定,再修改的方式被称之为悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)。 之所以叫做悲观锁,是因为这是一种对数据的修改抱有悲观态度的并发控制方式。我们一般认为数据被并发修改的概率比较大,所以需要在修改之前先加锁。 悲观并发控制实际上是 “先取锁再访问”的保守策略 , 为数据处理的安全提供了保证 。  但是在效率方面,处理加锁的机制会 让数据库产生额外的开销 ,还有增加 产生死锁 的机会; 另外,还会 降低并行性 ,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数据。 乐观锁 乐观锁( Optimistic Locking ) 是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。 相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。 乐观并发控制相信事务之间的数据竞争(data race)的概率是比较小的,因此 尽可能直接做下去

spring boot 事务不起作用

半城伤御伤魂 提交于 2019-11-26 12:02:24
使用springboot 配置了 @EnableTransactionManagement @Transactional 但是事务根本不起作用。 首先第一点:Spring的AOP事务管理默认是针对RunTimeException回滚,这个例外是unchecked exceptions。unchecked exception异常都是RuntimeException的子类。 如果遇到checked exceptions意外就不回滚。 如何改变默认规则: 1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class) 2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class) checked exceptions 其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被捕捉处理。 unchecked exceptions 需要程序员自己分析代码决定是否捕获和处理,比如 空指针,被0除... 其次是第二点 查看数据库中,表的引擎方式。 1 查看mysql现在已提供什么存储引擎: show engines; 只有InnoDB是支持事务的 mysql> show engines;

数据库------事务

拟墨画扇 提交于 2019-11-26 10:34:42
Transaction(事务),有四个特性:原子性、一致性、隔离性、持久性,在这其中,最重要的一致性由原子性、隔离性、持久性来保证。   隔离性分为: 未提交读(RU) 已提交读(RC) 可重复读(RR) 串行化(serializable)   每个级别都会解决不同的问题,通常是:脏读、不可重复读和幻读 脏读 不可重复读 幻读 RU √ √ √ RC × √ √ RR × × × Serializble × × ×   在MySql中,RR级别不会导致幻读,如在使用默认select时,MySQL使用MVCC机制保证不会幻读   原子性:事务是一个完整的操作,事务的各步骤是不可再分割的,要么都执行,要么都不执行   一致性:当事务完成的时候,数据必须处于一致状态   隔离性:对数据进行修改的所有事务是不会被其它所打扰,事务是独立的,不依赖或影响其它事务   持久性:事务完成后,对数据库的修改被永久保存,事务日志能够保持事务的持久性 来源: https://www.cnblogs.com/Mr-RanX/p/11318202.html

mysql知识点

限于喜欢 提交于 2019-11-26 10:29:13
sql注入问题 sql语句应该考虑哪些安全性问题 防止sql注入,对特殊字符进行过滤、转义或者使用预编译的sql语句绑定变量 当sql语句运行报错时,不要把数据库返回的错误信息全部显示给用户,以防止泄露服务器和数据库相关信息 sql注入 如果sql语句在拼接的情况下,使得查询永远成立,如拼接上 or '1'='1',会发生不安全问题 解决办法: 参数绑定:不拼接字符串,使用preparedStatement,参数使用set方法进行填装 检查变量的数据类型:如sql语句类似where id={$id},数据库中所有的id都是数字,那么在执行sql语句前,要保证ID是int类型 所有的sql语句都封装在存储过程中 存储过程 一些编译好的sql语句,这些sql语句代码向一个方法一样实现一些功能,然后再给这些代码块取一个名字,在用到这个功能的时候调用它即可。 优点 存储过程因为SQL 语句已经预编译过了,因此运行的速度比较快。 存储过程在服务器端运行,减少客户端的压力。 允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次,类似方法的复用。 减少网络流量,客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL 语句相比自然数据量少了很多。 增强了使用的安全性,充分利用系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制

.net Dapper 学习与实践系列(2) ---Dapper进阶

﹥>﹥吖頭↗ 提交于 2019-11-26 05:36:59
写在前面 在上一小节中,我们学习、实践和总结记录了Dapper的基础用法。而这一小节,我们继续深入的学习一下Dapper这个小型 ORM框架的其他用法。在这个实列中,我们会用到两个有关联的表。 前期准备 首先,还是沿用之前的的项目。库还是原来的DemoDb数据库。如还是不清楚的,可以看上一篇。 在DemoDb数据库新增产品表 //用户表 create table[sys_user]( [user_id] [nvarchar](36) primary key not null, [u_id] [nvarchar](20) null, [u_password] [nchar](50) null, [gender] [nchar](1) null, [user_name] [nvarchar](50) null, [creation_time] [datetime] default(getdate()) null, [status] [nvarchar](1) null, ) //产品表 create table [sys_product]( [productid] [nvarchar](36) primary key not null, [productname] [nvarchar](50) null, [productDesc] [nvarchar](50) null,

理解MYSQL组提交和二阶段提交

被刻印的时光 ゝ 提交于 2019-11-26 04:46:43
https://blog.51cto.com/13476134/2370714 本文开始讲组提交和二阶段提交前,先了解下BINLOG和REDO LOG; 两个日志关系 在ORACLE 对应的是REDO LOG和ARCHIVE LOG ,只是两者关系不一样。 在ORACLE数据库里 ARCHIVE LOG 是 REDO LOG的 历史日志记录。 REDO LOG 就记录当前数据库修改行为的日志。 REDO LOG 一般分成3组, 每组里面必须有1个日志文件,自然可以1个以上的日志文件。通过切换组 就可以把REDO LOG 文件写入到ARCHIVE LOG文件中。 在MYSQL 里面 INNDOB的REDO LOG和MYSQL 的BINLOG 是两个独立体,不像ORACLE是时间上的关系。因为MYSQL 里面可以包含多个存储引擎,每个引擎有自己的独立日志。BINLOG是处于MYSQL的服务层,而REDO LOG 是INNDODB存储引擎层。当一个事务涉及了多个存储引擎的时候,也就是跨了引擎。那么只有BINLOG记录的才是唯一正确的,而INNODB记录的只是事务修改了INNODB引擎的,而该事务修改别的引擎就无法记录了。所以在MYSQL里面一切以BINLOG为主。 REDO 组提交 所为组提交,是只一组事务一起提交。innodb Redo log的刷盘操作将会是最终影响MySQL