mysql-事务与锁基础

什么是事务

mysql中一个mysql语句或者是一组sql语句要么全不执行成功,要么全部执行失败,失败后数据变回原始数据模样。

举例:A给B 100元钱,sql的两哥步骤的操: A-100 ,B+100;在对数据AB用户进行操作时,要么A-100 ,B+100均成功,要么两个都失败,失败后。如果 A-100失败,则B+100不执行;如果B+100失败,则A-100操作回滚。即失败后AB的数据和操作前的数据一致。

在数据被锁住的时候,其他线程需要操作该条数据的时候会有一定访问权限,是否可读可写可改。

事务的实现是通过不同的锁来实现隔离级别。

为什么有些存储引擎(myisam)不支持事务

首先不是所有的存储引擎都支持功能的 :

  • 支持事务:innodb,BDB
  • 不支持事务:myisam

在mysql中 不同的存储引擎支持不同的锁级别。

  • 表锁:Mysiam 和 早期的BDB(锁住整个表,因为对象是整个表所以没有什么计算上的限制,故此锁的实现上开销小速度快)
  • 页锁:BDB (锁住某个页面的数据【mysql中是16kb的数据】,相对而言开销一般,速度一般。属于折中型)
  • 行锁:Innodb(锁住某一行的数据,但是这样也导致他的实现更加的复杂,开销最大,速度最慢【需要定位数据的位置】)

总结:myisam只支持表锁,所以不支持事务,在我们的代码中一般都是用行锁所以数据格式一般使用Innodb。

知识点引入:

行锁分为:排它锁和共享锁

  1. 排他锁:不允许读,不允许写
  2. 共享锁:允许读,不允许写

注意:锁不影响 select * from tableName;的查询。

事务的四个特性(ACID)

  • 原子性(Atomicity):操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。
  • 一致性(Consistency):事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
  •  隔离性(Isolation):隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
  • 持久性(Durability):当事务正确完成后,它对于数据的改变是永久性的。

事务不会自动回滚

事务在执行过程中不会自动回滚,需要手动回滚。在开发中需要自己去用代码去执行回滚操作。

示例如下:

package com.zcib.utils;
import java.sql.SQLException;
 
 
 
public class TestTransaction {//这里不能直接抛异常,要回滚
    public static void main(String []args)  {
 
    String sql1="update bankaccount set account=account-100 where id=2";//转账功能
    String sql2="update bankaccount set account=account+100 where id=1";
 
    try{
        JDBCUtils.beginTranscation();//开启事务
        JDBCUtils.update(sql1);
        int i=4;
        if(i%2==0){
            throw new RuntimeException("D人为抛的异常!");
        }
        
        JDBCUtils.update(sql2);
        JDBCUtils.commitTranscation();//提交事务
    }//catch(SQLException | ClassNotFoundException e){
       catch (Exception e) {//人为添加异常使用Exception接收处理,软件工程
        //完成,可回滚
    
        try {
            JDBCUtils.rollbackTranscation(); //回滚事务
        } catch (SQLException e1) {
            throw new RuntimeException(e);
        }
    }    
}
}
 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值