网站闭站,上海网站建设sheji021,网站站群 硬盘扩容 申请报告,青岛房产中介网站开发事务概念 MySQL事务是一个或者多个的数据库操作#xff0c;要么全部执行成功#xff0c;要么全部失败回滚。 事务是通过事务日志来实现的#xff0c;事务日志包括#xff1a;redo log和undo log。 事务状态
事务有以下五种状态#xff1a;
活动的部分提交的失败的中止的…事务概念 MySQL事务是一个或者多个的数据库操作要么全部执行成功要么全部失败回滚。 事务是通过事务日志来实现的事务日志包括redo log和undo log。 事务状态
事务有以下五种状态
活动的部分提交的失败的中止的提交的
活动
事务对应的数据库操作正在执行过程中时我们就说该事务处在活动的状态。
部分提交
事务对应的数据库操作的最后一个操作执行完成但是操作都在内存中此刻还没有将数据刷新到磁盘中这个状态称为部分提交
失败
当事务处在活动或部分提交的状态时遭到了某种错误数据库自身的错误、操作系统错误或者直接断电等导致操作不能进行下去或者人为停止这个状态称为失败。
中止
如果事务执行了半截而变为失败的状态撤销失败事务对当前数据库造成的影响我们把这个撤销的过程称之为回滚。
当回滚操作执行完毕时也就是数据库恢复到了执行事务之前的状态我们就说该事务处在了中止的状态。
提交 当一个处在部分提交的状态的事务将修改过的数据都同步到磁盘上之后我们就可以说该事务处在了提交的状态。 有一张图我认为解释的非常好给大家看看 只有当事务处于提交的或者中止的状态时一个事务的生命周期才算是结束 讲了这么多事务有什么作用
可以保证复杂数据库操作数据的一致性尤其是并发访问数据的时候。MySQL 事务主要用于处理操作量大复杂度高的数据。
事务的特点
原子性Atomicity又称不可分割性 事务的数据操作要么全部执行成功要么全部失败回滚到执行之前的状态就像这个事务从来没有执行过一样。 #隔离性Isolation又称独立性 多个事务之间是相互隔离互不影响的。数据库允许多个并发事务同时对其数据进行读写和修改的能力隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。 四种隔离状态
1. 读未提交Read uncommitted
2. 读提交Read committed
3. 可重复读Repeatable read
4. 串行化Serializable一致性Consistency 在事务操作之前和之后数据都是保持一个相同的状态数据库的完整性没有被破坏。 原子性和隔离性对一致性有着至关重要的影响。 持久性Durability 当事务操作完成后数据会被刷新到磁盘永久保存即便是系统故障也不会丢失。 知道这些理念了那么具体应该怎么操作呢
接下来是事务的实操
事务实操语法)
基本语法
启动
方式1
mysql begin;
Query OK, 0 rows affected (0.00 sec)
mysql 事务操作SQL......方式2
mysql start transaction read only;
Query OK, 0 rows affected (0.00 sec)
mysql 事务操作SQL......注意第二种方式如果设事务只读的话对数据库进行写操作会报错。
提交commit
mysql commit;
Query OK, 0 rows affected (0.00 sec)回滚rollback)
mysql rollback;
Query OK, 0 rows affected (0.00 sec)实操
首先我们先创建个表 创建数据表
create table account(- id int(10) auto_increment,- name varchar(30),- balance int(10),- primary key (id));
插入数据
insert into account(name,balance) values(老王媳妇,100),(老王,10);我们现在的需求是老王媳妇转账给老王20元这个时候涉及到多个操作就可以用MySQL的事务。
执行步骤 执行步骤
1. 从老王媳妇账户读取数据
2. 从老王媳妇账户上减掉20元
3. 从老王账户读取数据
4. 给老王账户增加20元
5. 执行提交成功
6. 此时老王媳妇账户只有80元啦而老王账户有30元啦老王高兴不得了咯具体操作 事务启动
mysql begin;
Query OK, 0 rows affected (0.01 sec)
语句1
mysql update account set balancebalance-20 where id 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
语句2
mysql update account set balancebalance20 where id 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
提交
mysql commit;
Query OK, 0 rows affected (0.01 sec)事务设置与查看
查看事务开启情况
mysql SHOW VARIABLES LIKE autocommit;
----------------------
| Variable_name | Value |
----------------------
| autocommit | ON |
----------------------要注意默认事务是自动提交的也就是每执行一条SQL就会提交。如果想执行完SQL还去操作事务那么就需要显示开启begincommitrollback。显示开启就是像之前语法一样要写出来。 自动提交很明显不方便我们对数据库的操作那怎么样才能避免自动提交
如何关闭自动提交
第一种 显式的的使用START TRANSACTION或者BEGIN语句开启一个事务。 第二种 把系统变量autocommit的值设置为OFF。 SET autocommit OFF; 关闭自动提交之后称为隐式提交
隐式提交 当我们使用START TRANSACTION或者BEGIN语句开启了一个事务或者把系统变量autocommit的值设置为OFF时事务就不会进行自动提交但是如果我们输入了某些语句之后就会悄悄的提交掉就像我们输入了COMMIT语句了一样这种因为某些特殊的语句而导致事务提交的情况称为隐式提交 一些隐式提交的语句
定义或修改数据库对象的数据定义语言Data definition language缩写为DDL 所谓的数据库对象指的就是数据库、表、视图、存储过程等等这些东西。当我们使用CREATE、ALTER、DROP等语句去修改这些所谓的数据库对象时就会隐式的提交前边语句所属于的事务。 BEGIN;
SELECT ... # 事务中的一条语句
UPDATE ... # 事务中的一条语句
... # 事务中的其它语句
CREATE TABLE ... # 此语句会隐式的提交前边语句所属于的事务隐式使用或修改mysql数据库中的表 隐式使用或修改mysql数据库中的表。 当我们使用ALTER USER、CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD等语句时也会隐式的提交前边语句所属于的事务。 事务控制或关于锁定的语句 事务控制或关于锁定的语句。 当我们在一个事务还没提交或者回滚时就又使用START TRANSACTION或者BEGIN语句开启了另一个事务时会隐式的提交上一个事务。 BEGIN;
SELECT ... # 事务中的一条语句
UPDATE ... # 事务中的一条语句
... # 事务中的其它语句
BEGIN; # 此语句会隐式的提交前边语句所属于的事务或者当前的autocommit系统变量的值为OFF我们手动把它调为ON时也会隐式的提交前边语句所属的事务。 或者使用LOCK TABLES、UNLOCK TABLES等关于锁定的语句也会隐式的提交前边语句所属的事务。 #加载数据的语句 比如我们使用LOAD DATA语句来批量往数据库中导入数据时也会隐式的提交前边语句所属的事务。 #关于MySQL复制的一些语句 使用START SLAVE、STOP SLAVE、RESET SLAVE、CHANGE MASTER TO等语句时也会隐式的提交前边语句所属的事务。 #其它的一些语句 使用ANALYZE TABLE、CACHE INDEX、CHECK TABLE、FLUSH、 LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE、RESET等语句也会隐式的提交前边语句所属的事务