关于事务
何为事务?
1.事务是指事务开始到事务结束之间的一组sql语句的操作单元,并且是组内所有sql语句共同完成的业务逻辑。
2.要想使用事务,首先关闭系统自动提交功能(因为系统默认的为自动提交),等待所有在sql语句组中的语句都执行完毕后,再进行手动提交。
关闭系统内自动提交的方式:set autocommit=0;
打开系统自动提交的方式:set autocommit=1;
3..要想事务成功提交,必须是该sql语句组中所有的sql语句都实现,否则该事务提交失败,需手动回滚rollback使数据库回到初识状态。
写到这里,我昨天在项目中遇到一个误区,在这儿我用实例来解释一下:
设计一个事务,同时在student表和teacher表中各添加一条记录?
student表结构:
teacher表结构:
Start transaction; --开始一个事务
Insert into student values
(‘1315925010’,’刘德华’,’男’,’2016-01-01’,’汉’,’中国’,’M02’,’2016-01-01’); --该语句插入记录成功
Insert into teacher values
(‘T100’,’林志玲’,’2016-01-01’,’美女讲师’); --该语句插入记录失败(插入的字段值列表不够)
Commit; --手动提交
总结:上面事务虽然执行了,也成功提交了,但是事务成功的前提是要么所有的sql语句都执行,要么都不执行;反过来在观察上面的事务,查看student表的数据时,发现数据插入成功,而查看teacher表数据时却未插入成功,这就破环了事务的原子性,所以该事务是不成立的。
解决方案:只要sql组中任何一条语句未执行成功,我们就不应该提交该事务,而是将数据库回滚或将开始一个新的事务。
Start transaction; --开始一个事务
Insert into student values
(‘1315925010’,’刘德华’,’男’,’2016-01-01’,’汉’,’中国’,’M02’,’2016-01-01’); --该语句插入记录成功
Insert into teacher values
(‘T100’,’林志玲’,’2016-01-01’,’美女讲师’); --该语句插入记录失败(插入的字段值列表不够)
rollback; --记住:只要事务中的任意一条sql语句未执行成功,则需手动回滚,不该提交;否则破环事务的原子性。
事务的四大特性:(ACID)
1.原子性:事务sql组中语句要么都执行成功,要么都不执行
2.隔离性:事务之间互不影响
3.一致性:事务执行前后,数据是一致的
4.持久性:事务一旦提交,则永久对数据库产生影响
事务关键字:
打开事务:start transaction;
回滚事务:rollback;
提交事务:commit;
设置数据库提交方式为非自动的:set autocommit=0;设置数据库提交方式为自动的:set autocommit=1;