原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分
一致性:在事务处理执行之前和之后,数据是一致的。
隔离性:一个事务处理对另一个事务处理没有影响。
持续性:当事务处理成功执行到结束的时候,其效果在数据库中被永久纪录下来。 原子性我能理解,一致性和隔离性怎么理解啊,哪位高手能举例解释一下?
在Java中能在一个事务中设置回滚点,可以回滚到事务的某个位置,这个和事务的原子性相违背吗?
一个事务是在调用tx.commit()或tx.rollback()结束的吗?
一致性:在事务处理执行之前和之后,数据是一致的。
隔离性:一个事务处理对另一个事务处理没有影响。
持续性:当事务处理成功执行到结束的时候,其效果在数据库中被永久纪录下来。 原子性我能理解,一致性和隔离性怎么理解啊,哪位高手能举例解释一下?
在Java中能在一个事务中设置回滚点,可以回滚到事务的某个位置,这个和事务的原子性相违背吗?
一个事务是在调用tx.commit()或tx.rollback()结束的吗?
-- 插入数据A, 写进数据还是A,不会变成B 隔离性:一个事务处理对另一个事务处理没有影响。
-- 事务A 增加数据,事务B删除数据, 互相不影响 持续性:当事务处理成功执行到结束的时候,其效果在数据库中被永久纪录下来。
-- 插入数据库的数据写到了磁盘,就是永久了
原子性
在Java中能在一个事务中设置回滚点,可以回滚到事务的某个位置,这个和事务的原子性相违背吗?是采用事务嵌套来做的吗?一致性是不是说
在一个事务中读取某个数据时,这个数据正好在其他事务中被修改,在其他事务未提交前,这个事务都无法读取到其他事务修改后的数据。如果读取到了,其他事务回滚,这就是脏读,即不一致。隔离性没理解:
事务A删除了数据,事务B更新这个数据,有影响持续性
什么时候标识数据库发生物理变化,commit?
事务A对某个TABLE进行读取,此后B事务对TABLE进行了修改,可在事务A中并看不到B事务所作的修改,读取到的仍然是查询开始那一刻的数据,B对A没有产生影响。持续性
持续性就是说事务的修改永久的保存在了数据文件中。至于什么时候发生物理变化,也就是说具体什么时候修改被写入磁盘上的数据文件,有很多种条件下都会促使DBWR去写数据文件。
COMMIT了只是保证REDO写入到了REDO LOG,并不能保证数据写入数据文件中。
看下边的测试:开了俩连接,在第一个连接进行如下操作:
SQL> select * from test01; ID NAME
---------- ----------
1 ok
2 noSQL> delete from test01; 2 rows deleted.SQL> select * from test01; no rows selected
没有commit;
这个时候在第二个连接查看一下数据:
SQL> show user
USER is "SCOTT"
SQL> select * from test01; ID NAME
---------- ----------
1 ok
2 no
数据仍然在,一致性!
update一下,看看会怎么样,其实不说也明白,会等待,因为另一个连接持有锁
SQL> update test01 set name = 'test';等在这里了......
去另一边commit一下
SQL> update test01 set name = 'test'; 0 rows updated.SQL> select * from test01; no rows selected
0条更新......没数据了,插几条进去看看
SQL> insert into test01 values (1,'test1'); 1 row created.SQL> insert into test01 values (2,'test2'); 1 row created.SQL> insert into test01 values (3,'test3'); 1 row created.SQL> select * from test01; ID NAME
---------- ----------
1 test1
2 test2
3 test3
没有commit;
去另一边看看
SQL> select * from test01; no rows selected
这边也+几条数据看看SQL> insert into test01 values(4,'test4'); 1 row created.SQL> insert into test01 values(5,'test5'); 1 row created.SQL> select * from test01; ID NAME
---------- ----------
4 test4
5 test5
看不到另一边的数据,隔离性!
在另一边commit一下,然后再看:
SQL> select * from test01; ID NAME
---------- ----------
1 test1
2 test2
3 test3
4 test4
5 test5
都看到了,持续性!
例子弄的有点简单,楼主就当看笑话吧!
比如说在网上转帐从A账户往B账户转100元,需要执行两个操作A账户减少100元,B账户增加100元。这两个操作如果只执行了第一个操作,那么你是不会答应的,因为你损失了100元,而如果只执行了第二个操作,第一个操作,那么你也不会答应。这两个操作要么都同时执行成功,要么都执行失败,否则一个成功,一个失败都是不合理的。
因此将这两个操作放在一个事务中去执行,事务的原子性,保证了要么都执行,要么都不执行。一致性的话,再举个例子,比如说你刷卡买电影票,步骤是这样的,首先营业员先给你打出一张票,然后你刷卡,拿电影票。这个时候,实际的电影票是资源,而数据库中的电影票是数据。
营业员如果帮你打出一张票,这个时候,数据库中电影票实际上数目减一了,但是如果你刷卡失败了,实际的电影票资源并没有发生改变,这个时候执行回滚操作,恢复到打票之前的数据。这样保证了资源和数据的一致性。隔离性的话,就是两个事务之间的操作相互之间不会影响,即不会发生脏读、不可重复读和幻象。持久性的话比较好理解,就是事务执行成功以后,数据将保存在数据库中不再发生改变。
还是打开俩连接
SQL> show user
USER is "SCOTT"
SQL> select * from test01; ID NAME
---------- ----------
1 test1
2 test2
3 test3
4 test4
5 test5
在一个连接中进行如下操作:
SQL> update test01 set name='ok' where id = 1; 1 row updated.SQL> select * from test01; ID NAME
---------- ----------
1 ok
2 test2
3 test3
4 test4
5 test5SQL> savepoint A; Savepoint created.SQL> insert into test01 values (6,'test6'); 1 row created.SQL> select * from test01; ID NAME
---------- ----------
1 ok
2 test2
3 test3
4 test4
5 test5
6 test66 rows selected.SQL> savepoint B; Savepoint created.
SQL> update test01 set name = 'no' where id = 2; 1 row updated.SQL> select * from test01; ID NAME
---------- ----------
1 ok
2 no
3 test3
4 test4
5 test5
6 test66 rows selected.
下边去另一个连接看一下:
SQL> show user
USER is "SCOTT"
SQL> select * from test01; ID NAME
---------- ----------
1 test1
2 test2
3 test3
4 test4
5 test5
还是以前的数据,这里最容易理解的是隔离性!
去原来那边继续操作:
SQL> rollback to savepoint B; Rollback complete.SQL> select * from test01; ID NAME
---------- ----------
1 ok
2 test2
3 test3
4 test4
5 test5
6 test66 rows selected.
在去另一边看看变化:(其实想一想就明白,应该是没变化,因为rollback to savepoint严格来说只能是事务内的一个rollback操作,事务本身并没有结束)
SQL> select * from test01; ID NAME
---------- ----------
1 test1
2 test2
3 test3
4 test4
5 test5
还是原来的数据,没一点变化,因为这边就没任何操作,其实不论那边做什么操作,只要是事务没结束,这边数据永远是那边事务操作前的数据,其实这就体现了一致性!
继续去那边操作一下:
SQL> commit; Commit complete.SQL> select * from test01; ID NAME
---------- ----------
1 ok
2 test2
3 test3
4 test4
5 test5
6 test66 rows selected.
这回去另一边再看一下:
SQL> select * from test01; ID NAME
---------- ----------
1 ok
2 test2
3 test3
4 test4
5 test5
6 test66 rows selected.
数据变了,因为那边的事务结束了,这其实既是持续性的体现,也是一致性的体现!楼主不必过多的理解概念,实际上所有的这一切都是为了需求,你做什么样的产品,只要是需求满足!就OK!
就向楼上举的例子一样,为了需求数据的准确性,出了这个概念!当需求发现技术实现不了时,就会出新的概念!