<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">1、要支持事务,需要将数据表类型设置为InnoDB或BDB, 不是所有的表类型都支持事务,MyISAM类型表不能支持事务,只能通过伪事务对表实现事务处理。</span>
2、事务的四个特性:原子性、一致性、孤立性和持久性。
3、创建事务的一般过程是:初始化事务、创建事务、应用SELECT语句查询数据是否被录入和提交事务。
4、创建用户aaa的命令:
mysql> insert into mysql.user(Host, User, Password) values("localhost", "aaa", password("123456"));
Query OK, 1 row affected, 3 warnings (0.07 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.20 sec)
5、创建事务
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
<pre name="code" class="delphi">mysql> insert into tbl_trans values (1, "aaa");
Query OK, 1 row affected (0.03 sec)
mysql> select * from tbl_trans;
+------+------+
| id | name |
+------+------+
| 1 | aaa |
+------+------+
1 row in set (0.00 sec)
6、提交事务 。在事务提交之前,其他用户查询上表tbl_trans得到的结果为空,只有当前用户使用命令“COMMIT”提交了事务之后,其他用户就可以通过会话查询结果了。
7、撤销事务(事务回滚)。用户想要撤销刚才是数据库操作,可使用ROLLBACK命令撤销数据库中的所有变化。如果执行一个回滚操作,则在输入START TRANSACTION命令后的所有SQL语句都将执行回滚操作。
8、事务的周期由用户在命令提示符中输入START TRANSACTION 指令开始,直至用户输入COMMIT结束。事务不支持嵌套功能,当用户在未结束第一个事务又重新打开一个事务,则前一个事务会自动提交,同样mysql命令中很多命令都会隐藏执行COMMIT 命令。
9、设置 系统不自动提交的命令为 set autocommit =0;
查询系统提交设置的命令为 select @@ autocommit;
10、mysql 伪事务。使用表锁定来锁定表的操作,可以加强非事务表在执行过程中的安全性和稳定性,如下
(1)读锁定,不允许写:
mysql> lock table tbl_trans read;
Query OK, 0 rows affected (0.06 sec)
mysql> insert tbl_trans values(3, "ccc");
ERROR 1099 (HY000): Table 'tbl_trans' was locked with a READ lock and can't be u
pdated
mysql>
解除表锁定测试:
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql> insert tbl_trans values(3, "ccc");
Query OK, 1 row affected (0.00 sec)
mysql> select * from tbl_trans;
+------+------+
| id | name |
+------+------+
| 1 | aaa |
| 2 | bbb |
| 3 | ccc |
+------+------+
3 rows in set (0.00 sec)
(2)写锁定,不允许其他用户读,但是当前用户自己仍然可以读取表,测试如下:
mysql> lock table tbl_trans write;
Query OK, 0 rows affected (0.04 sec)
mysql> select * from tbl_trans;
+------+------+
| id | name |
+------+------+
| 1 | aaa |
| 2 | bbb |
| 3 | ccc |
+------+------+
3 rows in set (0.00 sec)
如果打开一个新用户会话,进行查询操作是,界面会被卡住,表示当前的表已经被执行写锁定,只能等待,无法执行下一步的操作。
(3)以上读写锁定可以针对多个表进行设置,格式为lock table1, table2, .... read/write