2021-06-27Java实训学习笔记08---事务

MySQL 事务

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句

MySQL 事务特性

一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

事务:针对于增删改,只有增删改还会影响到数据库中表的数据

新建transcation类

事务控制语句:

BEGIN 或 START TRANSACTION 显式地开启一个事务;
COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

在这里插入图片描述

package com.chengxian.subject05.transcation;

import java.sql.Connection;
import java.sql.SQLException;

import com.chengxian.subject05.util.JdbcUtil;

/**
 * 事务
 * @author 74670
 *
 */
public class Transaction {
	/**
	 * 开启事务
	 * @throws SQLException 
	 */
	public void begin() throws SQLException{
		Connection connection=JdbcUtil.getConnection();
		connection.setAutoCommit(false);
	}
	
	/**
	 * 提交事务
	 * @throws SQLException 
	 */
	public void commit() throws SQLException{
		Connection connection=JdbcUtil.getConnection();
        connection.commit();		
	}
	
	/**
	 * 回滚事务
	 * @throws SQLException 
	 */
	public void rollback() throws SQLException{
		Connection connection=JdbcUtil.getConnection();
		connection.rollback();
	}
}

MYSQL 事务处理主要有两种方法:

1、用 BEGIN, ROLLBACK, COMMIT来实现

 BEGIN 开始一个事务
 ROLLBACK 事务回滚
 COMMIT 事务确认

2、直接用 SET 来改变 MySQL 的自动提交模式:

 SET AUTOCOMMIT=0 禁止自动提交
 SET AUTOCOMMIT=1 开启自动提交

在配置文件object.txt中添加事务

在这里插入图片描述

tx=com.chengxian.subject05.transcation.Transaction
subjectDao=com.chengxian.subject05.dao.SubjectDao
userDao=com.chengxian.subject05.dao.UserDao
subjectService=com.chengxian.subject05.service.SubjectService
userService=com.chengxian.subject05.service.UserService

修改SubjectService.java

public class SubjectService {
	//private SubjectDao subjectDao = new SubjectDao();
	private SubjectDao subjectDao=(SubjectDao)ObjectFactory.getObject("subjectDao");
	private Transaction tx=(Transaction) ObjectFactory.getObject("tx");

在这里插入图片描述

	/**
	 * 添加毕设信息
	 * @param subject
	 * @return
	 * @throws SubjectException
	 */
	public boolean addSubject(Subject subject) throws SubjectException{
		boolean flag=false;
		try {
			tx.begin();//开启事务
			flag= subjectDao.addSubject(subject);
			tx.commit();//提交事务
		} catch (SQLException e) {
			try {
				tx.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				throw new SubjectException("数据库回滚异常");
			}//回滚事务
			e.printStackTrace();
			throw new SubjectException("数据库异常");
		}
		return flag;
	}

在这里插入图片描述

	
	/**
	 * 根据编号id删除对应的毕设信息
	 * @param id
	 * @return
	 * @throws SubjectException 
	 */
	public boolean delSubjectById(int id) throws SubjectException{
		boolean flag=false;
		try {
			tx.begin();
			flag= subjectDao.delSubject(id);
			tx.commit();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			try {
				tx.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				throw new SubjectException("数据库回滚异常");
			}
			e.printStackTrace();
			throw new SubjectException("数据库异常");						
		}
		return flag;
	}
	

在这里插入图片描述

	/**
	 * 根据编号id修改毕设题目信息
	 * @return
	 * @throws SubjectException 
	 */
	public boolean updateTitleById(String title, int id) throws SubjectException{
		boolean flag=false;
		try {
			tx.begin();
			flag= subjectDao.updateTitleById(title, id);
			tx.commit();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			try {
				tx.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				throw new SubjectException("数据库回滚异常");
			}
			e.printStackTrace();
			throw new SubjectException("数据库异常");			
		}
		return flag;
	}

在这里插入图片描述
至此文件结构已发展如下图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值