mysql事务

//事物的四个特性ACID
原子性(atomicity)
一致性(consistency)
隔离性(isolation)
持久性(durability)


原子性(Atomicity)

事务中的所有操作要么全部执行,要么都不执行;

如果事务没有原子性的保证,那么在发生系统

故障的情况下,数据库就有可能处于不一致状

态。

 

原子性(Atomicity)

如果故障发生在write(A)和read(B)之间,则将

有可能造成帐户A的余额已经减去50元钱,而

帐户B的余额却没有改变,凭空就少了50元钱。

 

值得注意的是,即使没有故障发生,系统在某

一时刻也会处于不一致状态。原子性的要求就

是这种不一致状态除了在事务执行当中出现

外,在其他任何时刻都是不可见的。保证原子

性是DBMS的责任:即事务管理器和恢复管理

器的责任。

 

一致性(Consistency)

主要强调的是,如果在执行事务之前数据库是

一致的,那么在执行事务之后数据库也还是一

致的;

所谓一致性简单地说就是数据库中数据的完整

性,包括它们的正确性。

 

对于图中的事务Ti来说,一致性要求就是事务

的执行不改变帐户A和帐户B的和。否则的话

事务就会创造或销毁钱!

 

单个事务的一致性是由对该事务进行编键的应

用程序员的责任,但是在某些情况下利用

DBMS中完整性约束(如触发器)的自动检查功

能有助于一致性的维护。

 

隔离性(Isolation)

即使多个事务并发(同时)执行,每个事务都

感觉不到系统中有其他的事务在执行,因而也

就能保证数据库的一致性;

 

事情的起因:

即使每个事务都能保持一致性和原子性,但如

果几个事务并发执行,且访问相同的数据项,

则它们的操作会以人们所不希望的某种方式交

叉执行,结果导致不一致的状态!

 

访问相同数据项的两个事务并发执行

 

 

解决办法:

如果几个事务要访问相同的数据项,为了保证

数据库的一致性,可以让这几个事务:

①串行执行:即一个接着一个地执行事务;

②并发执行:即同时执行多个事务,但用并发

控制机制来解决不同事务间的相互影响。

 

 

隔离性的保证:

事务的隔离性能够确保事务并发执行后的系统

状态与这些事务按某种次序串行执行后的状态

是等价的。保证隔离性也是DBMS的责任:即

并发控制管理器的责任。

 

持久性(Durability)

事务成功执行后它对数据库的修改是永久的,

即使系统出现故障也不受影响。

持久性的含义是说:一旦事务成功执行之后,

它对数据库的更新是永久的。可以用以下两种

方式中的任何一种来达到持久性的目的:

以牺牲应用系统的性能为代价

以多占用磁盘空间为代价


###事物操作
root@test  14:54>set autocommit=1;
Query OK, 0 rows affected (0.00 sec)

root@test  14:56>start transaction;
Query OK, 0 rows affected (0.00 sec)

root@test  14:56>insert into tuge select 'teacher';
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

root@test  14:56>commit;
Query OK, 0 rows affected (0.01 sec)


//测试事物批量提交
CREATE TABLE `test_load` (
  `a` int(11) DEFAULT NULL,
  `b` char(80) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


delimiter $$
create procedure pro_load2(v_count int unsigned)
begin
declare s int unsigned default 1;
declare c char(80) default repeat('a',80);
start transaction;
while s < v_count
do
insert into test_load select null,c;
set s = s+1;
end while;
commit;
end$$
delimiter ;


//设置事物保存点
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier

root@test  16:12>start transaction;
Query OK, 0 rows affected (0.00 sec)

root@test  16:13>savepoint t1;
Query OK, 0 rows affected (0.00 sec)

root@test  16:13>insert into tuge select '111111';
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

root@test  16:13>savepoint t2;
Query OK, 0 rows affected (0.00 sec)

root@test  16:13>insert into tuge select '222222';
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

root@test  16:13>rollback to savepoint t2;
Query OK, 0 rows affected (0.00 sec)

root@test  16:13>commit;
Query OK, 0 rows affected (0.01 sec)

root@test  16:13>select * from tuge;



 





你可能感兴趣的:(MySQL事务)