1、事务
1、事务:一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)
2、事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)
-
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
-
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
-
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
-
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
2、事务控制语句
1、初始化事务
START TRANSACTION;
2、创建事务
USE DA_DATABASES;
START TRANSACTION;
INSERT into T_MapMapping(Mapid,Monsterlist,Marks) VALUES (4,'1,2','');
3、提交事务
COMMIT
4、撤销事务(回滚)
ROLLBACK
3、事务的存在周期
简单事物的周期流程图如下:
4、MySQL事务行为
mysql存在两个可以控制行为的变量:AUTOCOMMIT和TRANSACTIONISOLACTION变量
1、自动提交
在MySQL中,如不更改自动提交变量,则系统会自动向数据库提交结果,用户在执行数据库过程中,不需要使用操作语句执行事务。如果用户希望通过控制MySQL自动提交参数,可以更改模式,比如关闭自动提交参数
SET AUTOCOMMIT = 0;
2、事务的孤立级
事务孤立级别,也称为事务隔离级别,是指在多个事务同时存在,并都有可能改变数据库中的数据时,事务内外对数据访问的状态。在集算器中,事务是指在同一个数据库连接中所执行的SQL语言。一般情况下,只有事务中执行TCL时才会执行把数据提交到数据库或回滚等操作。但是,当事务中执行DDL时,实际上相当于在事务中执行了提交,会把当前未保存的数据存储到数据库中。如执行了一条create table的语句,在数据库中添加了一个新表,此时就相当于执行了一次commit操作。
事务孤立级别可以分为以下四个等级:
(1)、读取提交内容(Read Committed)。这是大多数数据库默认的事务孤立级别,一个事务只能看到已经提交的改变。
(2)、读取未提交内容(Read Uncommitted)。在这种孤立级别下,所有事务都能看到其它事务未提交的执行结果。这种状况下,事务中读到的结果有可能不是最终的结果,这被称为脏读。
(3)、可重读(Repeatable Read)。在这种孤立级别下,同一事务的多个并行实例可以看到相同的数据。在这种状况下,不同的实例可能相互影响,出现“幻读”的现象。
(4)、可串行化(Serializable)。这是最高的孤立级别,此时会强制事务排序,使之不会发生相互冲突,但也会带来最低的效率,有可能出现超时现象或者共享锁竞争。
在集算器中,可以在用connect函数连接数据库时,添加选项,指定不同的事务孤立级别:@c表示Read Committed,@u表示Read Uncommitted,@r表示Repeatable Read,@s表示Serializable。对于已经存在的数据库连接,也可以用db.isolate() 函数,获取当前事务孤立级别,并添加选项改变数据库连接的事务孤立级别。
修改事务的孤立级,注意:要想修改事物的孤立级,需要获取SUPER优先权,以便用户可以顺利执行修改操作。
SELECT @@tx_isolation;
5、InnoDB锁
1、锁的类型
(1)、共享锁
(2)、排他锁
(3)、意向锁
2、用表锁代替事务
#为指定数据表添加锁定
LOCK TABLES table_name lock_type,……
#用户执行数据表的操作,可以添加、删除或者更改部分数据
#用户完成对锁定数据表的操作后,需要对该表进行解锁操作,释放该表的锁定状态
UNLOCK TABLES
(1)、以读方式锁定数据表
设置锁定用户的其它操作,比如删除,插入,更新都不允许操作,直至用户进行解锁操作
LOCK TABLE table_name READ;
(2)、以写方式锁定数据表
设置用户可以修改表中数据,但是出自己以外的其他会话中的用户不能进行任何读操作
LOCK TABLE table_name WRITE;