Nine MVP's Blog

20/12/2006

ถามเกี่ยวกับ webservice และ transaction

Filed under: Computers and Internet — Nine MVP @ 5:27 pm

ถามเกี่ยวกับ webservice และ transaction

คือสมมติว่า ผมมี webservice อยู่ 2 ตัว และ database server อยู่ 2 ตัว โดย webservice1 จะติดต่อกับ DB1 และ
webservice2 จะติดต่อกับ DB2
จากนั้นผมก็มี application อยู่ตัวนึงซึ่งทำการเรียก webservice1
จากนั้น webserice1 ก็จะทำการ query data อะไรบางอย่างจาก DB1 แล้วส่งไปให้ webservice2
จากนั้น webservie2 ก็จะทำการ insert ข้อมูลลง DB2 แล้วส่งค่าอะไรบางอย่างกลับไปให้ webservice1
จากนั้น webservice1 ก็จะทำการ update status ตามที่ได้รับจาก webservice2

ดังภาพข้างล่าง

 
  
 
application call –> Webservice1DB1              
                                                          ———————->>>    ส่ง data ไป insert
                                                                                                Webervice2DB2
                                                          <<<———————-    ส่ง data กลับไปเพื่อ update status  
                            Webservice1 — DB1  ถ้าเกิด error ตรงนี้
app <—-  รับ message return
 
คำถาม
1. เราสามารถทำการ Rollback สิ่งต่างๆ ที่เราทำไปทั้งใน DB1 และ DB2 ได้หรือไม่
2. ถ้าทำได้ใช้วิธีการอย่างไร

รบกวนหน่อยครับ  ( เหตุการณ์นี้ ยังไม่เกิด ขึ้นจริง แต่ผมกลัวว่า ไม่นานมันจะต้องเกิด เลยมาถาม )

 

  LaLaLa  
 

1. ทำได้ครับ

2. ทั้ง 2 WebService ต้อง ใช้งาน WS-Transaction, WS-Coordination
    ซึ่งสำหรับ MS Plateform ไม่ง่ายเท่าไหร่นัก  = =’ ไว้จะพยายามทำ example มาให้ดูครับ รอก่อนนะ หุหุ

  Nine (นาย)  
ตอบคุณ มี่ นะครับ
คือผมต้องการที่จะควบคุม ความถูกต้องของข้อมูลครับ  ไม่เกี่ยงวิธี 
ขอให้ง่าย performance ดี คือผม ไม่ค่อยจะมีความรู้เท่าไหร่อ่ะ แบบว่ารู้น้อย
ซึ่งปกติแล้ว ผมก็ใช้
 
try
{
   BeginTransaction()
   —————– code————-
   Commit()
}
catch(Exception ex)
{
  RolllBack()
}
 
ผมเลยเรียกมันว่า Transaction

ยังงัยก็รบกวนด้วยนะครับ ^^"

 
 

  LaLaLa  

ถามเพิ่ม

1. WS อยู่บน server เครื่องเดียวกันหรือว่าแยกเครื่อง
2. DB ——————-"—————————–
3. หาก ws แยก server กันอยุ่ แล้ว Network แยกจากกันหรือไม่

  Nine (นาย)  
ทุกอย่าง ถูกแยกออกจากกัน หมดเลยครับ

เหมือนเป็นการ ส่งต่อ project อ่ะ พี่เชน (phase 2 phase 3 คงพอนึกออกนะครับ)


  LaLaLa  
REPLY #6 (30728)

งั้นก็พอจะบอกได้เลยว่า Client ที่เรียก -> WS1 Transaction ไม่สามารถ cover ไปถึง WS2 นะ
เพราะ WebService โดย nature ของมันคือเป็นแบบ StateLess  ทำอะไรไปแล้วก็จำไม่ได้ เป็นปลาทอง
ต้องทำให้ WS1, WS2 ใช้ WS-TX, WS-Coor. ตามที่บอกไปข้างบนนั่นหละครับ
 
แต่จะทดสอบ TransactionScope ให้ก่อนนะ
โดยการเรียก WS1 ที่ Server1 และ WS1 ไปเรียก WS2 ที่ Server2 อย่างที่บอกมา
ได้ผลไงจะมาเล่าให้ฟังครับ

  Nine (นาย)  

ผลมาละ

จากการที่ทดสอบ เป็นไปตามที่คาดไว้คือ
 
WS1 มีการใช้ TransactionScope  และภายในมีการเรียกใช้ WS2 อีกครั้งหนึ่ง
หลังจาก ผ่าน method ส่วนที่ Insert Data ไปแล้ว สั่งให้ Throw Exeception ขึ้นเพื่อยกเลิก TX ที่ทำทั้งหมด
 
DB ที่ WS1 ได้ทำการ rollback ออกหมด
แต่ DB ที่ WS2 ไม่สามารถ Rollback ออกได้ 
 
 
Code ที่ใช้ทดสอบ
 
 

// ใช้ TransactionScope

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))

{

 

    //เรียก WS2 เพื่อทำการ Insert Data

    isdmcdev.Service sv = new WSGFSolution.isdmcdev.Service();

    sv.InsertMultiDB(Name, Age, Salary);
 

 

    // ใส่ ServerName เลือก DB Name

    string constrServer2 = @"Server=SQL1;Initial Catalog=TestDB;User Id=sa;password=pass";

    // Insert ลง local DB

    InsertMethod(constrServer1, Name, Age, Salary);

 

    throw new Exception("ยกเลิก TX"); //จุดวาง Breakpoint

 

}

 
 
 
 
จากผลข้างบน พอจะมีทางเลือกอยู่บ้าง
1. ใช้ WS-* ที่ post ไปก่อนหน้านี้ ใช้ใน WS ฝั่งที่มีถูกการอ้างถึง
2. ใช้การควบคุมการ Rollback ค่าใน DB เอาเองโดยใช้ WS เขียนMethod  หากเกิด Error ขึ้นก็สั่งให้ rollback คำสั่ง sql ทั้งหมด
ถ้า update อะไรไปก็ให้ update ค่าเก่ากลับ ลบอะไรไปก็ insert กลับ
3. ใช้ WCF ทดแทน WS ทั้งหมด เพราะมีความสามารถในเรื่องการทำ statefull
 
 

  Nine (นาย)

3 Comments »

  1. ว้าว … ถามกันใหญ่เลย ถามบ้าง…แล้วนี้ พี่ Nine ของน้องต๋อ โสดเหรอเปล่า ค่ะเนี้ย
      — ไม่ทราบรับสมัคร ตำแหน่ง กิ๊กเหรอเปล่า 555+
    ปล..เข้ามาแซวเล่นเฉยๆๆ ค่ะแอบเข้ามาอ่าน blog พี่ชาย โหหหหห เดี๋ยวนี้กลายเป็นศิลานี้ ตอบปัญหาเรื่องหัวใจแล้วเหรอ ..เห้ยไม่ใช่ เรื่อง คอม แล้วเหรอ
    แล้วจะแวะมาก่อกวใหม่นะค๊า

    Comment by Tornoi — 04/05/2007 @ 3:23 pm

  2. เข้ามาเยี่ยมจ๊า แหม! ความรู้ท้างงงงน้านนนนนเรยเนอะ..ไว้ว่าง ๆ จะเข้ามาใหม่นะ

    Comment by yok — 16/01/2008 @ 3:56 pm

  3. สนใจกิ๊ก งิงิ

    Comment by Nuchit — 29/10/2009 @ 10:21 am


RSS feed for comments on this post. TrackBack URI

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Create a free website or blog at WordPress.com.

%d bloggers like this: