MYSQL事物总结

本文介绍了MySQL事务的基本概念,包括事务的ACID特性,事务的自动提交和手动控制,以及事务的隔离级别和它们可能导致的问题。还讨论了如何在MySQL中设置隔离级别,并提供了Java JDBC中控制事务的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:什么是事物?

事务是用户定义的一个数据库操作序列,这些操作要么全都做,要么全都不做,是一个不可分割的工作单元。在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。:2:事物概念

MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关的。

-MyISAM:不支持事务,用于只读程序提高性能

-InnoDB:支持ACID事务、行级锁、并发

-Berkeley DB:支持事务

2:事物的特性

事务必须具备以下四个属性,简称ACID 属性:

 

原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行

一致性(Consistency):当事务完成时,数据必须处于一致状态

隔离性(Isolation):事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离

永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性

3:Mysql中的事物控制

 MYSQL中,默认事务是自动提交的,即一条sql语句就是一个事务

 

改变事务提交方式

SET AUTOCOMMIT=1(默认)      #自动提交事务

SET AUTOCOMMIT=0                #手动提交事务

如果想多条sql放在一个事务中执行,则需要使用如下语句。

START TRANSACTION              #开启事务

COMMIT                                      #提交事务

ROLLBACK                                #回滚事务

SAVE  POINT 回滚点                  #设置回滚点

:4:事物的隔离级别

 

      多个线程开启各自事务操作数据库中数据时,数据库系统要负责  

      隔离操作,以保证各个线程在获取数据时的准确性。

 

      如果不考虑隔离性,可能会引发如下问题

      1:脏读(dirty reads)

       一个事务读取了另一个未提交的并行事务写的数据。

 

     2:不可重复读(non-repeatable reads)

      一个事务重新读取前面读取过的数据, 发现该数据已经被另一个已

      提交的事务修改过。

 

    3:幻读(phantom read)

     一个事务重新执行一个查询,返回一套符合查询条件的行, 发现这      

      些行因为其他最近提交的事务而发生了改变

4:事物的隔离性

       脏读:一个事务读取到了另一个未提交的数据

 

         不可重复读:在一个事务内读取表中某一行数据,多次读取结果不同

 

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

 

5:事物隔离性的设置语句

      数据库共定义了四种隔离级别:

  • Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
  •                Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免幻读
  •                Read committed:可避免脏读情况发生(读已提交)
  •                Read uncommitted:最低级别,以上情况均无法保证。(读未提交)
  • select @@tx_isolation      查询当前事务隔离级别
  • set [global/session]  transaction isolation level 设置事务隔离级别

MYSQL演示三种缺点

 

7:Java的JDBC中事物实现

JDBC控制事务语句

   conn.setAutoCommit(false); //  相当于start transaction

    //执行事务SQL语句

   conn.commit(); // commit

   conn.rollback();  //rollback

设置事务回滚点

Savepoint  sp = conn.setSavepoint();

//事务SQL语句

conn.rollback(sp);

conn.commit();   //回滚后必须要提交

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值