MySql事务

一、为什么会引入事务概念

在银行转账系统中进场会遇见一个现象,那便是如果A给B转账,但是转账的中间过程出了问题,导致A转账失败,但是B却得到了钱,因而出现了错误。下面使用简单的例子证明。

假设某数据库有数据如下:


新建一个Java项目,在里面写入下面代码:



得到的结果为:



上面的问题是:张三给李四转账了,但是由于中间过程出错,导致转账失败,导致李四没收到钱。


二、事务的应用

1、事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。

2、MySQL事务

a、mysql引擎是支持事务的
b、mysql默认自动提交事务。每条语句都处在单独的事务中。
c、手动控制事务
开启事务:start transaction | begin
提交事务:commit
回滚事务:rollback

下面以简单的例子来手动控制事务

(1)begin--commit,事务开启提交


查看数据库得到结果为:



(2)begin--rollback 进行事务回滚


得到的结果为:



3.JDBC中应用事务

在上面是在客户端进行事务处理,下面介绍的将是事务在jdbc中的应用

将上面的第一个代码修改为如下所示

package com.xfcy.test;

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

import org.junit.Test;

import com.xfcy.utils.DBUtils;

public class TestDemo01 {

	@Test
	public void test1(){
		Connection conn=null;
		PreparedStatement ps=null;
		
		
			try {
				conn=DBUtils.getConnection();
				conn.setAutoCommit(false);//其作用相当于begin
				ps=conn.prepareStatement("update testone set money=money-100 where name='张三'");
				ps.executeUpdate();
				ps=conn.prepareStatement("update testone set money=money+100 where name='李四'");
				ps.executeUpdate();
				
				conn.commit();//提交事务commit
			} catch (Exception e) {
				if(conn!=null){
					try {
						conn.rollback();//进行事务回滚
					} catch (SQLException e1) {
						e1.printStackTrace();
					}
				}
				e.printStackTrace();
			}finally{
				DBUtils.closeAll(null, ps, conn);
			}
			
		
	}
}

查看数据库结果为:



三、事务的基本性质

原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 

一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。

隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

四、事务的隔离级别

如果多个进程并发,则会导致下面的问题。

1、赃读:指一个事务读取了另一个事务未提交的数据




2、不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。一个事务读取到了另一个事务提交后的数据。


3、 虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。            (insert)



为了解决上面的问题发生,可以通过设置事务隔离级别完成。
* 1、READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。
* 2、READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)
* 4、REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认)
* 8、SERIALIZABLE: 避免赃读、不可重复读、虚读。
级别越高,性能越低,数据越安全



查看当前事务隔离级别: SELECT @@TX_ISOLATION;

查看当前数据库隔离级别


通过查询可以知道当前MySQL级别为:REPEATABLE READ


更改当前事务隔离界别: SET TRANSACTION ISOLATION LEVEL+(read uncommitted等),注意;设置隔离级别必须在事务前。





在jdbc中设置隔离级别

设置隔离级别必须在开启事务之前进行。

Connection.setTransactionIsolation(int level);
 而leve的值为:

①TRANSACTION_READ_COMMITTED:指示不可以发生脏读的常量;不可重复读和虚读可以发生。

②TRANSACTION_READ_UNCOMMITTED:指示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量

③TRANSACTION_REPEATABLE_READ:指示不可以发生脏读和不可重复读的常量;虚读可以发生。

④TRANSACTION_SERIALIZABLE:指示不可以发生脏读、不可重复读和虚读的常量。



总结

通常情况下,对于数据库的隔离级别不需要更改,对于这些知识更更多的是需要理解。上面便是个人对数据库事务的学习,如果有任何错误,希望提出,谢谢!






MySQL 事务是指一组数据库操作,这些操作要么全部执行,要么全部不执行,其目的是保证在并发环境下,数据的一致性和完整性。MySQL 事务具有 ACID 性质,即原子性、一致性、隔离性和持久性。 MySQL 中使用事务需要使用 BEGIN、COMMIT 和 ROLLBACK 语句,其中 BEGIN 表示开启一个事务,COMMIT 表示提交事务,ROLLBACK 表示回滚事务事务的基本语法如下: ``` BEGIN; -- 执行一组数据库操作 COMMIT; -- 提交事务 -- 或者 ROLLBACK; -- 回滚事务 ``` 在 MySQL 中,事务隔离级别分为四个等级,分别是 Read Uncommitted、Read Committed、Repeatable Read 和 Serializable。隔离级别越高,数据的一致性和完整性越高,但同时也会影响数据库的性能。 MySQL 事务的 ACID 性质有以下含义: 1. 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败回滚,不会只执行其中的一部分操作。 2. 一致性(Consistency):事务执行前后,数据库中的数据必须保持一致性状态,即满足数据库的约束条件和完整性规则。 3. 隔离性(Isolation):事务之间应该是相互隔离的,一个事务的执行不应该被其他事务干扰,保证事务之间的数据相互独立。 4. 持久性(Durability):事务提交后,对数据库的修改应该是永久性的,即使出现系统故障或电源故障,也不应该对数据产生影响。 总之,MySQL 事务是一组数据库操作,具有 ACID 性质,可以通过 BEGIN、COMMIT 和 ROLLBACK 语句来实现,隔离级别越高,数据的一致性和完整性越高,但同时也会影响数据库的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值