linux MySQL事务
事务是数据库中很重要的一方面,是保证操作的执行完整性。
目录
一、事务的概述
二、事务的作用
三、事务的特点
四、事务的应用
五、事务的管理
六、总结
一、事务的概述
1.事务的概念
事务是数据库管理系统中的一个重要概念,用于保证数据的一致性和完整性。事务通常包括一组数据库操作命令,这些命令要么全部执行,要么全部回滚,以保证数据的一致性。事务是并发控制的最小单元,适用于多用户同时操作的数据库系统场景,如银行、保险公司及证券交易系统等。事务具有ACID属性,即原子性、一致性、隔离性和持久性。MySQL提供了丰富的事务支持,包括隐式和显式事务,以及多版本并发控制等机制,可以帮助开发人员构建高效、可靠的数据库应用程序。
2.事务的背景
二、事务的作用
1.事务的作用
-
保证数据的一致性和完整性。通过将一组操作看作一个不可分割的整体来执行,事务可以确保数据的一致性和完整性,避免了数据不一致的问题。
-
支持并发操作。在多用户并发访问数据库的情况下,事务可以有效地避免数据冲突和竞争条件,提高系统的并发性能和可靠性。
-
支持数据恢复和回滚。在事务执行过程中,如果发生错误或者异常情况,可以通过回滚操作恢复到事务执行前的状态,从而避免了数据丢失和损坏的风险。
-
提高系统的可靠性和安全性。事务的引入极大地提高了数据库系统的可靠性和安全性,成为了现代数据库系统不可或缺的重要特性。
三、事务的特点
1.事务的特点
事务是数据库管理系统中的一个重要概念,具有以下几个特点:
-
原子性(Atomicity):事务是一个不可分割的工作逻辑单元,其所有操作要么全部执行,要么全部不执行。如果其中任何一个操作失败,整个事务都会回滚,回到事务开始前的状态。
-
一致性(Consistency):事务执行后,数据库的状态必须是合法的,即符合事务的约束条件和完整性规则。如果事务执行后数据库状态不合法,则事务必须被回滚。
-
隔离性(Isolation):并发执行的多个事务之间应该相互隔离,彼此不应该干扰。每个事务应该感知不到其他事务的存在,并且在事务执行期间对其他事务的操作应该是不可见的。
-
持久性(Durability):事务执行后,其结果应该是永久性的,即不受系统崩溃、故障或其他异常情况的影响。数据库系统应该通过日志或其他机制来确保事务的持久性。
综上所述,事务具有原子性、一致性、隔离性和持久性这四个特点,通常被称为ACID属性。这些特点保证了数据库操作的正确性和一致性,使得多个用户可以同时对数据库进行访问和操作,提高了系统的可靠性和并发性能。
四、事务的应用
1.事务的应用
五、事务的管理
1.事务的影响
在数据库系统中,多个事务之间的相互影响是一个非常重要的问题。由于多个事务可能同时访问和修改同一个数据,因此需要考虑这些事务之间的相互影响,以确保数据的一致性和完整性。以下是一些常见的事务之间的相互影响:
-
脏读(Dirty Read):一个事务读取了另一个事务尚未提交的数据,如果此时另一个事务发生回滚操作,则读取的数据将是无效的。这种情况会导致数据不一致和信息泄漏等问题。
-
不可重复读(Non-repeatable Read):一个事务在执行过程中多次读取同一个数据,但是读取到的数据不一致。这是因为在读取期间,另一个事务修改了同一条数据,导致数据发生了改变。
-
幻读(Phantom Read):一个事务在执行过程中读取了一批数据,但是在之后的操作中发现有新插入的数据,导致读取的数据不完整。这种情况与不可重复读的情况类似,但是出现的原因不同。
-
丢失更新(Lost Update):多个事务同时修改同一条数据,但是最后只有一个事务的修改被保留下来,其他事务的修改被覆盖掉了。这种情况会导致数据不完整和信息丢失等问题。
为了避免这些问题,需要使用事务管理技术来控制事务之间的相互影响。通常可以使用锁机制、MVCC、隔离级别、乐观并发控制和悲观并发控制等技术来避免脏读、不可重复读、幻读和丢失更新等问题。但是需要注意的是,不同的技术会对性能和并发性产生不同的影响,需要根据实际情况进行选择和调整。
2.Mysql及事务隔离级别
MySQL是一种流行的关系型数据库管理系统,支持事务和多种隔离级别。以下是MySQL中常见的事务隔离级别:
-
读未提交(Read Uncommitted):在此隔离级别下,一个事务可以读取另一个事务尚未提交的数据。这种隔离级别最不严格,可能导致脏读、不可重复读和幻读等问题。
-
读已提交(Read Committed):在此隔离级别下,一个事务只能读取已经提交的数据。这种隔离级别可以避免脏读,但是可能会导致不可重复读和幻读等问题。
-
可重复读(Repeatable Read):在此隔离级别下,一个事务在执行过程中多次读取同一条数据,读取到的数据始终相同,即使在事务执行期间有其他事务对数据进行了修改。这种隔离级别可以避免脏读和不可重复读,但是可能会导致幻读等问题。
-
串行化(Serializable):在此隔离级别下,所有事务串行执行,每个事务只能访问其他事务已经提交的数据。这种隔离级别最严格,可以避免脏读、不可重复读和幻读等问题,但是会导致性能下降。
MySQL默认的隔离级别是可重复读,可以通过设置SESSION或全局变量来修改隔离级别。在选择隔离级别时,需要考虑到数据完整性、并发性能和系统的可用性等因素,选择合适的隔离级别来平衡这些因素。
mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed 。
3.事务隔离级别的作用范围
全局级:对所有的会话有效
会话级:只对当前的会话有效
(1)查询全局事务隔离级别
show global variables like '%isolation%';
SELECT @@global.tx_isolation;
(2)查询会话事务隔离级别
show session variables like '%isolation%';
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;
(3)设置全局事务隔离级别
set global transaction isolation level read committed;
(4)设置会话事务隔离级别
set session transaction isolation level read committed;
4.事务控制语句
BEGIN 或 START TRANSACTION:显式地开启一个事务。
COMMIT 或 COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。
ROLLBACK 或 ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。
SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT;“S1”代表回滚点名称。
ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。
(1)提交事务
开始事务
修改数据
提交事务
(2)回滚事务
开始事务
修改数据
查看修改成功
回滚
回滚成功
(3)多点回滚
开始事务
修改数据
查看数据
设置还原点S1
再次修改数据
修改成功
设置S2还原点
回到S1还原点
还原成功
5.使用 set 设置控制事务
(1)查看Mysql中的AUTOCOMMIT值
SET AUTOCOMMIT=0; #禁止自动提交
SET AUTOCOMMIT=1; #开启自动提交,Mysql默认为1
总结:
如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。
当然无论开启与否,begin; commit|rollback; 都是独立的事务。
六、总结
mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed 。事务是数据库管理系统中的一个重要概念,用于处理操作量大、复杂度高的数据。事务具有ACID特性,即原子性、一致性、隔离性和持久性。原子性指事务是不可分割的,要么全部执行,要么全部回滚;一致性指事务执行前后数据库状态必须保持一致;隔离性指多个事务并发执行时,彼此之间不会产生影响;持久性指一旦事务提交,其修改的数据将会永久保存到数据库中。事务管理包括事务的开始和结束、锁机制、多版本并发控制、日志机制、保存点和分布式事务管理等技术。事务之间可能会产生脏读、不可重复读、幻读和丢失更新等问题,需要使用合适的隔离级别来避免这些问题。