当前位置: 首页 > news >正文

个人建站程序/优化大师官方

个人建站程序,优化大师官方,摄影设计方案,网站开发人员调试数据库事务 什么叫数据库事务 事务:一组逻辑操作单元,使数据从一种状态到另外一种状态,一组逻辑操作单元,一个或者多个DML操作 事务处理的原则: 保证所有事务都为一个工作单元执行 即使出现了故障,都不能改变这种方式当一个事务中执行了多个操作时,要么所有的事务都被提交(…

数据库事务

什么叫数据库事务

  • 事务:一组逻辑操作单元,使数据从一种状态到另外一种状态,一组逻辑操作单元,一个或者多个DML操作

事务处理的原则:

  • 保证所有事务都为一个工作单元执行 即使出现了故障,都不能改变这种方式当一个事务中执行了多个操作时,要么所有的事务都被提交(commit) , 那么这些修改就永久保存下来: 要么数据库管理系统将放弃所作的所有修改,整个事务回滚(roolBack) 到最初始状态

JDBC事务处理

  • 数据一旦提交 就不会发生回滚

那些操作会导致数据的自动提交?

DDL数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言

  • DDL操作一旦执行,就会自动提交 set autocommit = false 对DDL操作失效

DML数据操作语言,SQL中处理数据等操作统称为数据操纵语言

  • DML默认情况下,一旦执行,就会自动提交

我们通过set autocommit= false 的方式 取消DML操作的自动提交

  • 默认在关闭连接时,会自动的提交数据

JDBC程序中为了让多个 SQL 语句作为一个事务执行

  • 调用Connection对象的setAutoCommit(flase): 以取消自动提交事务
  • 在所有的sql语句都成功执行后,调用commit(); 方法提交事务
  • 出现异常时.调用rollback(); 进行回滚事务

若此时connection没有被关闭,还可能被被重复使用,则需要恢复其自动提交的状态

setAutoCommit(true) 尤其时使用数据库连接池技术时,执行close()方法前,建议恢复自动提交状态

案例

用户AA向用户BB转账100
未考虑数据库事务情况下的转账操作:
   @Testpublic void testUpdate() {String sql1 = "update user_table set balance = balance - 100 where user = ?";update(sql1, "AA");//模拟网络异常
//        System.out.println(10 / 0);String sql2 = "update user_table set balance = balance + 100 where user = ?";update(sql2, "BB");System.out.println("转账成功");}// 通用的增删改操作---version 1.0public int update(String sql, Object... args) {Connection conn = null;PreparedStatement ps = null;try {//1, 获取数据库连接conn = JDBCUtils.getConnection();//2 预编译sql语句 返回PreparedStatement的实例ps = conn.prepareStatement(sql);//填充占位符for (int i = 0; i < args.length; i++) {ps.setObject(i + 1, args[i]);}//执行return ps.executeUpdate();} catch (Exception e) {e.printStackTrace();} finally {//修改其为自动提交数据//主要针对于使用数据库连接池的使用try {conn.setAutoCommit(true);} catch (SQLException throwables) {throwables.printStackTrace();}//关闭资源JDBCUtils.closeResource(conn, ps);}return 0;}

出现问题:当模拟网络异常时,AA的钱扣除了,但是没有加到B中

解决问题:考虑数据库事务后进行转账操作

 *1.什么叫数据库事务*  事务:一组逻辑操作单元,使数据从一种状态到另外一种状态*         > 一组逻辑操作单元,一个或者多个DML操作*2. 事务处理的原则:保证所有事务都为一个工作单元执行  即使出现了故障,都不能改变这种方式* 当一个事务中执行了多个操作时,要么所有的事务都被提交(commit)  那么这些修改就永久保存下来* : 要么数据库管理系统将放弃所作的所有修改,整个事务回滚(roolBack) 到最初始状态


考虑数据库事务后的转账操作

注意:

为了数据报错正常产生回滚

  • update1(Connection conn, String sql, Object... args) 连接数据库由外部测试提供,也即是关闭连接是JDBCUtils.closeResource(null, ps);
  • .取消自动提conn.setAutoCommit(false);
  • 所有的 SQL 语句都成功执行后,调用 commit();方法提交事务
  • 出现异常 调用 rollback(); 方法回滚事务
 @Testpublic void testUpdateWithTx() {Connection conn = null;try {conn = JDBCUtils.getConnection();//1.取消自动提交conn.setAutoCommit(false);String sql1 = "update user_table set balance = balance - 100 where user = ?";update1(conn, sql1, "AA");//模拟网路异常
//            System.out.println(10 / 0);String sql2 = "update user_table set balance = balance + 100 where user = ?";update1(conn, sql2, "BB");System.out.println("转账成功");//2 提交数据conn.commit();} catch (Exception e) {e.printStackTrace();//3 数据回滚try {conn.rollback();} catch (SQLException throwables) {throwables.printStackTrace();}} finally {JDBCUtils.closeResource(conn, null);}}// 通用的增删改操作---version 2.0public int update1(Connection conn, String sql, Object... args) {PreparedStatement ps = null;try {//1 预编译sql语句 返回PreparedStatement的实例ps = conn.prepareStatement(sql);//2 填充占位符for (int i = 0; i < args.length; i++) {ps.setObject(i + 1, args[i]);}//3 执行return ps.executeUpdate();} catch (Exception e) {e.printStackTrace();} finally {//4 关闭资源JDBCUtils.closeResource(null, ps);}return 0;}

连接数据库相关操作

操作数据库的工具类

package com.nie1.transaction.util;import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;/*** @Description 操作数据库的工具类*/
public class JDBCUtils {/*** @return* @throws Exception* @Description 获取数据库的连接*/public static Connection getConnection() throws Exception {// 1.读取配置文件中的4个基本信息InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");Properties pros = new Properties();pros.load(is);//2获取四个配置String user = pros.getProperty("user");String password = pros.getProperty("password");String url = pros.getProperty("url");String driverClass = pros.getProperty("driverClass");// 3.加载驱动Class.forName(driverClass);// 4.获取连接Connection conn = DriverManager.getConnection(url, user, password);return conn;}/*** @Description 关闭连接和Statement的操作*/public static void closeResource(Connection conn, Statement ps) {try {if (ps != null)ps.close();} catch (SQLException e) {e.printStackTrace();}try {if (conn != null)conn.close();} catch (SQLException e) {e.printStackTrace();}}/*** @Description 关闭资源操作*/public static void closeResource(Connection conn, Statement ps, ResultSet rs) {try {if (ps != null)ps.close();} catch (SQLException e) {e.printStackTrace();}try {if (conn != null)conn.close();} catch (SQLException e) {e.printStackTrace();}try {if (rs != null)rs.close();} catch (SQLException e) {e.printStackTrace();}}
}

配置文件jdbc.properties

#获取
user=root
password=123123
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
driverClass=com.mysql.jdbc.Driver
http://www.lbrq.cn/news/1326061.html

相关文章:

  • 网站怎么做付款平台/东莞关键词seo
  • 大型行业网站/seo建站网络公司
  • 建设一个网站预算/站长工具高清吗
  • 网站建设登录注册怎么做/seo网站推广推荐
  • 个人做网站需要多少钱/抖音排名优化
  • 澧县网站建设/厦门头条今日新闻
  • 网站怎么做内部链接/网站建设详细方案
  • 网站建设 英文/潍坊快速网站排名
  • 万网影/快手seo关键词优化
  • 凤楼网站怎么做的/营销页面设计
  • 建站平台哪个最好/驻马店百度seo
  • 重庆市建设工程管理协会网站/天津做优化好的公司
  • 劳动保障局瓯海劳务市场和做网站/seo做的比较牛的公司
  • php网站空间支持/志鸿优化设计官网
  • 成都网站建设116web/免费友情链接网页
  • 网站美食建设图片/网络营销推广外包平台
  • 保定网站seo服务/每天4元代发广告
  • wordpress 内部标签/网站seo推广营销
  • 做网站开发的步骤/搜狗网页版
  • 药品加工厂做网站/南宁seo专员
  • 网站建设服务费/百度关键字优化价格
  • 陕西哪些公司做企业网站/百度推广开户流程
  • 如何建设网站的外链/百度推广运营
  • 网站怎么做cp备案号/建站模板哪个好
  • 深圳做网站在去那备案/谷歌seo价格
  • 腾讯云企业官网建设/泰安seo网络公司
  • 营销网络图/杭州谷歌seo公司
  • 怎么做bs网站/交换神器
  • 做网站要签合同吗/新东方英语培训机构官网
  • 做设计一般用什么素材网站/软文范例500字
  • 网络编程-加密算法
  • 自建rustdesk服务器过程记录
  • 每日练习(红黑树)
  • elk部署加日志收集
  • AI+金融,如何跨越大模型和场景鸿沟?
  • 2025年7月31日