数据库误操作

一般指,不小心删除/插入了某个数据,或是当有多个操作同时执行时,因为网络原因或者机器原因,导致整体操作只执行了一半,而数据已失去了逻辑性

例如:

  1. 删除A表数据
  2. 插入B表中与A表关联的某个字段

若此时刚进行完第一个操作,用户关掉网页。那么此时A表数据已经删除,无法进行第二步操作。
如果当用户重新打开网页时,继续从第一步开始执行,则无法进行第一步操作,因为删除操作已经做了。

当我们遇到这种情况下,有几种解决方法。

  1. 软处理
    给A表增加一个status状态,第一步删除时,只将状态值改变,当第二步操作做完,才完全删除该条数据

  2. 将操作顺序置换
    先进行第二步操作,插入完成后再删除

  3. 利用日志回滚数据库数据(太麻烦了,费时间,划不来)

  4. 使用开源框架中的方法
    若运用了开源框架,例如hibernate,即可调用session.rollback()方法,进行对话回滚

  5. SQL事务
    将这两步操作合并成一个整体的操作,即SQL事务

SQL事务

适用场景

适用于一组数据库操作命令。

对这组命令,要么全部执行,要么全部不执行。因此事务是一个不可分割的整体。

事务分类

1 显式事务:用begin transaction明确指定事务的开始。
2 隐性事务:打开隐性事务:set implicit_transactions on,当以隐性事务模式操作时,SQL Servler将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需要提交或回滚事务。
3 自动提交事务:SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务。如果成功执行,则自动提交,否则回滚。

事务语法

  • BEGIN TRAN:设置起始点
    数据库会忽略这个起点之后的最终没有提交的所有语句

  • COMMIT TRAN:使事务成为数据库中永久的、不可逆转的一部分
    事务的提交是一个事务的终点

  • ROLLBACK TRAN:本质上说想要忘记它曾经发生过
    ROLLBACK做的事情是回到起点。从关联的BEGIN语句开始发生的任何事情事实上都会被忘记

  • SAVE TRAN:创建一个特定标记符,只允许部分回滚
    保存事务从本质上说就是创建书签(bookmark)。为书签建立一个名称,在建立了”书签”之后,可以在回滚中引用它。创建书签的好处是可以回滚到代码中的特定点上-只要为想要回滚到的那个保存点命名。

事务代码例子

例子中的PO单头和PO单身是两张具有联系的表

     /**作者Jurbo,时间:2016/8/6* PO/POline设定页面* 删除po单头和对应的PO单身**/public Boolean deletePo(string po_no){string sql = "BEGIN TRAN Tran_deletePo    --开始事务"+ "DECLARE @tran_error int;"+ "SET @tran_error = 0;"+ "BEGIN TRY "+ "--删除PO单头"+ "delete from wms_po_header "+ "where po_no = @po_no; "+ "SET @tran_error = @tran_error + @@ERROR;"+ "--删除PO单身"+ "delete from wms_po_line "+ "where po_header_id = (select po_header_id from wms_po_header where po_no=@po_no)"+ "END TRY"+ "BEGIN CATCH"+ "PRINT '出现异常,错误编号:' + convert(varchar,error_number()) + ',错误消息:' + error_message()"+ "SET @tran_error = @tran_error + 1"+ "END CATCH"+ "IF(@tran_error > 0)"+ "BEGIN"+ "--执行出错,回滚事务"+ "ROLLBACK TRAN;"+ "PRINT '删除PO/POline失败,取消交易!';"+ "END"+ "ELSE"+ "BEGIN"+ "--没有异常,提交事务"+ " COMMIT TRAN;"+ "PRINT '删除PO/POline成功!';"+ "END";SqlParameter[] parameters = {new SqlParameter("po_no",po_no),};DB.connect();//返回受影响行数InfluenceNumint InfluenceNum = DB.delete(sql, parameters);if (InfluenceNum > 0)return true;elsereturn false;}

MySQL数据恢复

  1. 开启binary log功能
  2. 查看产生的binary log
  3. 利用bin_log恢复数据(date与position)

因为这块没有研究过,故开传送门

MySQL数据恢复--binlog

数据库误操作,如何恢复数据(SQL事务,或数据库还原)相关推荐

  1. SQLServer数据库误操作如何恢复

    总目录 文章目录 总目录 前言 一.恢复数据实例 1.创建初始数据 2.保证数据恢复的前提条件 前提1 - 数据库创建时便已设置恢复模式为完整 前提2 - 至少做过一次完整的备份 3.模拟不小心误操作 ...

  2. TSPITR方式数据库找回误操作丢失的数据

    一.TSPITR介绍 TSPITR全称是Tablespace Point In Time Recover(表空间基于时间点的不完全恢复).原理是通过辅助实例基于时间还原出误操作前的数据通过DataPu ...

  3. SQL Server 数据库常用操作:修改数据(ALTER、UPDATE语句的使用)

    1.修改数据库 移动数据库文件 ALTER DATABASE Publish SET OFFLINE/*将Publish数据库设置为离线(脱机)状态*/ALTER DATABASE Publish M ...

  4. mysql binlog恢复sql_binlog2sql实现MySQL误操作的恢复

    对于MySQL数据库中的误操作删除数据的恢复问题,可以使用基于MySQL中binlog做到类似于闪回或者生成反向操作的SQL语句来实现,是MySQL中一个非常实用的功能. 原理不难理解,基于MySQL ...

  5. mysql权限的误操作的恢复

    mysql权限的误操作的恢复 原因:由于误操作,我把repl用户授予了所有权限,但删除了数据库中的其他用户及权限,因此repl用户虽然具有操作所有数据库的权限,但没有grant权限,所以若想授予其他用 ...

  6. 分析一次磁盘分区表的误操作和恢复

    前两天帮谢姨装Ubuntu到一个分区上做Win7和Ubuntu双系统,当时大脑发热就直接在Win7下把Ubuntu所在的分区格式化了.然后便是各种凶残的的误操作和恢复,折腾了一夜.现在把过程写下来,对 ...

  7. GHOST 误操作的恢复方法

    GHOST 误操作的恢复方法 来自网络,重新整理并排版. 相信不少朋友有过使用GHOST误操作的经历,就象下面这样: 恢复系统的时候不慎选择了 LOCAL-DISK-FROM-IMAGE 直接选择恢复 ...

  8. oracle insert汉字出错,Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名...

    本文主要向大家介绍了Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. Oracle数据库,用 ...

  9. 数据库创建(利用写好的数据库表生成创建表的sql语句+利用生成的数据库创建表加同步数据sql)

    一.利用写好的数据库表生成创建表的sql语句 1.简单创建一个数据库,并建一个表,并编辑数据. a.建库 b.建表 c.编辑表,保存时输入表名 d.刷新一下,出来了 e.转存导出sql文件. 二.利用 ...

最新文章

  1. CTFshow 信息收集 web12
  2. TensorFlow数据统计
  3. BigDecimal运算的工具类
  4. 在vscode上运行linux代码,在linux上安装VSCode
  5. 100行代码让您学会JavaScript原生的Proxy设计模式
  6. ASP.NET Core分布式项目实战(oauth2 + oidc 实现 server部分)--学习笔记
  7. pythonfor循环100次_以写代学: python for循环 range函数 xrange函数
  8. redis 公网 安全_redis漏洞复现
  9. 工作笔记-关于工具函数的编写问题
  10. deepsooncms在Ubuntu 14.04上部署教程
  11. 火狐浏览器快捷键大全
  12. 并发系列(二)----Java内存模型
  13. win+apache实现ssl的证书认证
  14. 【广告技术】用张量分解预测广告库存,广告投放更可靠!
  15. Koa v2.x 中文文档 上下文(Context)
  16. Android Layout XML属性
  17. Servlet+jsp入门教程
  18. Python——百度识图-相似图片爬虫下载解决方案
  19. 作为研发面试官,亲自教你面试技巧
  20. matlab时频工具箱简介,matlab时频工具箱

热门文章

  1. c语言二叉树的遍历菜单系统,二叉树遍历C语言的实现
  2. 如何模拟手机访问浏览器
  3. ICG-PEG-CHO,吲哚菁绿-聚乙二醇-醛基 荧光染料试剂说明
  4. Kali 安装中文输入法(超详细)
  5. php 二进制 转换为字符串,php二进制转换为字符串的案例
  6. 基于Raft协议的KV存储系统
  7. 前端工程师必须知道的用javaScript刷新当前页面的3种方法
  8. [转]xml文件中的转义字符
  9. 阿里云数仓Dataphin数仓功能点含义解释
  10. HDC.Cloud 2021剧透:六大创新产品、开发者年度盛宴即将开启